A bit of a solution to my own problem:
I can check if two states are compatible enough to "lua_xmove" using the "lua_topointer" method of both states. Given
lua_State* leftL, lua_State* rightL
I can check if they both originate from the same place by checking the "void*" pointer value of their registries:
const void* left_registry = lua_topointer(leftL, LUA_REGISTRYINDEX);
const void* right_registry = lua_topointer(rightL, LUA_REGISTRYINDEX);
return left_registry == right_registry;
This doesn't let me figure out if a "lua_State*" is the "main" one, but it does let me determine if they are disparate states (e.g., two completely different states originating from a "luaL_newstate()" call or similar). The only thing left to do is also add a check for if they're NULL or if they are equal beforehand, and that way I can tell if they are "lua_xmove"-able. I won't know about how "safe" they are: e.g., if someone blows up the thread from a coroutine and my lua_CFunction was called from that coroutine and I didn't get the main thread off the `lua_State*` handed to me, calls on C API functions with that state will crash horrifically (LuaJIT, strangely enough, does not suffer this issue).
Sorry for clogging the list with my question, when the solution was right there the whole time!