Yes, that’s fine. When the user hits Delete on a module, the Module is deleted on the UI thread after it’s removed from the Engine.
Make sure to use std::launch::async with std::async so a new thread is launched, not std::launch::deferred which runs the code on the thread that requests the task’s result.
One thing I know you can do for saving to Json is compress it & then base64 encode it. Then you have text you can store in Json as a string. It’ll still be big but not that big.