Futures / co-routines / green-threads don’t need to stall a main thread.
However, it will require allocated stack. And, more importantly, if some resource/object on your call chain goes away while you’re not running, and you come back and run some more, you suddenly will crash.
This is one reason Blueprints only allow Delay nodes in event dispatchers, which are the “first level” of the call stack – there is nothing else to return to.
That being said, threading is totally available in Unreal – the pre-emptive kind, rather than the co-operative kind. You could use that for asynchronizing work in C++.
There are several versions that take objects, so you can just create a simple trampoline object that contains the state. Add a template and a C++ closure and it’s almost transparent.
You can also pass in a TFunction instance that closes over whatever variables you need.
Once you’ve done this once or twice, it’s simple, second nature, and no longer a nuisance