“The book” has a section on the FFI page on asynchronous callbacks from threads generated by C code. It’s a bit vague, except to suggest you should probably pass the data to a Rust thread through a channel.
What do you actually need to avoid doing in such a callback? There are some Windows APIs that create a thread or queue items to a threadpool, and OSX now has some similar concepts. I could bury it all in a C library, but I’d prefer to stay in Rust if possible.