That's correct, you can only call ObjectWrap::Ref() from the main thread.
It's in theory possible to create a thread-safe ObjectWrap class that
acquires a v8::Locker but that won't help with the race condition you
mention: the object can still be garbage-collected before the call to
ObjectWrap::Ref().
You can make the object weak with ObjectWrap::MakeWeak().
ObjectWrap::MakeWeak() invoke the destructor of your class when the
object is garbage-collected.
Please note that libuv handles must be explicitly closed with
uv_close() and that uv_close() is asynchronous: you cannot call it
from your destructor on an embedded uv_async_t handle because the
lifetime of the handle needs to exceed that of the embedding object.
New the uv_async_t in your constructor and delete it in the OnClose
callback.