What causes a transient to changes status to “Does Not Expire”?

Transients do not expire if expiration time is not provided. Note that you can inadvertently cause this if you provide zero value for the time.

You should be aware that this still doesn’t guarantee transient will stay alive. That’s shouldn’t be relied on.

As a core implementation detail it will delete all database transients on database version upgrades. That has been implemented while back to address the issues with possibility of database getting clogged with enormous amounts of old transients.