With current WASM implementations, you could write your WASM modules such that their execution state is fully specified by exported globals, tables, and the contents of linear memory, and save all of that. But there's no external means to force access to all the needed information if you don't make the module export everything relevant, and refrain from using any data that is not externally visible.
However, you could write your own WASM runtime, and ensure that the data structures it uses to represent the instantiated module state are all reversibly serializable. You could even do so in JavaScript and WASM, if you want it to run in a browser, but you'd obviously have a significant emulation slowdown.