We’re rapidly approaching the limits of my own understanding here, I don’t write code in C++, either as a core developer or acting as a third-party developer.
Since TL, OpenNurbs and Rhino are all McNeel products, pumping data such as Curves from one to the other is fully under our control. We can set up the data structures in such a way that no needless copying or conversion need take place.
Whereas OpenNurbs can be best thought of as a geometry/object database, TL can be best thought of as a purely functional library. OpenNurbs handles things like layers, object names, properties, documents, 3dm (de)serialization, and so on, whereas if you want to measure the length of a curve you’d use TL*. Rhino combines the two and adds a bit of magic of its own to turn the whole bundle into a usable end product.
These kinds of nitty-gritty details are usually well beyond the interest of even plug-in developers. There are good reasons (I assume anyway, I’m not privy to them) for the way Rhino is put together, but it’s just implementation.
* Though always through Rhino as an intermediary.