It might be worth (re)reviewing Sam Gross's nogil effort to see how he approached this:

https://github.com/colesbury/nogil#readme

He goes into plenty of detail in his design document about how he deals with immortal objects. From that document:

Some objects, such as interned strings, small integers, statically allocated PyTypeObjects, and the True, False, and None objects stay alive for the lifetime of the program. These objects are marked as immortal by setting the least-significant bit of the local reference count field (bit 0). The Py_INCREF and Py_DECREF macros are no-ops for these objects.

Skip