That's exactly where I think the problem is. cstring should be explicitly an unsafe type, and users who use it should know about how it behaves. It's a type that is just for wrappers, where you have to deal with unmanaged pointers anyway.
And no matter how you treat the cstring, it will be an exception to every other type if you do not treat it just like a pointer. Otherwise it will be it's own special reference type that needs it's own special handling in escape analysis.