Yes, that's currently the best way to handle that situation and what
embind currently does.
As for it being complex, yes. This was an optimization so that functions that don't need to suspend don't have to return the micro task queue. It also made it so code that would only trigger the sync behaviour didn't need to be re-written to handle the async version.
FWIW, with JSPI (what will hopefully replace asyncify) async exports will always return a promise. We've been discussing changing asyncify to match this behavior, but there are downsides as mentioned above.