Pyodide can dynamically load libraries that are separate Wasm modules so it is worth checking out how that works.
WASM also doesn't allow for functions with variadic return counts.
Why does it have that limitation, and is there any hope that it will someday be overcome?
It was designed to support C-like languages, so you can do the equivalent of loading a DLL (or dynamic shared object). However in Lisp it is not unusual to compile just one function at a time. It's definitely possible to create a DLL for each function and load each DLL, but it requires a completely different architecture than most Lisp implementations use (in which, when you compile a function, it just writes the machine code to the heap).
There are similar impedance mismatches with so-called W^X systems (where you are disallowed from having a page be both (W)ritable and e(X)ecutable.