My perception is that, if you understand multi-threading, it’s relatively easy to make a third-party project free-threading compatible, while making it subinterpreter-compatible seems more difficult while bringing more limited benefits. That is, you need specific knowledge about specific aspects of the Python C API and extension module initialization, rather than generic knowledge on the topic of multi-threading.
As I said in another discussion (for the record, we have a mixture of Cython and direct C API calls in PyArrow):