#haskellで質問して教えて貰ったところ、かなり状況が改善しました。
Before: 500MBとかメモリ食べて事実上途中でフリーズ(私のPCの空き物理メモリほぼ全部)
After: 10-30MB程度。
(このプログラム(仮想マシン)が未完成なので正常動作しているのかは不明ですが、別の仮想データを食わせたら100MB-200MB程度使いはするものの
前より先まで計算が進んだので状況が改善しています)
以下、参考までに。
1,{-# LANGUAGE BangPatterns #-}をソース先頭に追加。
2,UMとInstのフィールドそれぞれに!を付けた。InstのWord32は{-# UNPACK #-}つき。
3,setRegValの定義をsetRegVal m ra !vに変更。
4,opAMEND内のletのnewvalueとnewarrayの先頭に!追加。
#codepadのコードっていつまで残るのかな?後でこのレス読む人の参考になるといいんですが。
あとこの場合、メモリ使用量の点ではSeqじゃなくてUArrayもありかもと言われました。
更新速度は当然落ちるみたいですが。

プログラム自体は正常動作しているのか不明ですがメモリ使用量は改善しました。
ありがとうございました。