The inputs/outputs/… of the modules themselves aren’t bound to a thread. As long as you’re not doing anything in the process() of the expanders (or at least nothing such as calculating variables or constructing/destructing objects that the main module then tries to use), multithreading shouldn’t have an impact.
I did wonder back then if there was a risk that an expander module might get moved/removed on another thread while the main module was in its process() method and using the inputs of that expander module, so I asked it in another post (Accessing expanders when Rack is set to multiple threads), and Andrew confirmed that the VCV Rack engine stops this from happening (and that accessing the inputs/outputs of an expander is safe since there is no relevant process() logic in the expander itself)