I can't do this myself, but would there be a way (C external probably, or mxj) to access your current patcher as text, copy the text into a new file, then save it automatically with a name like yourpatch_1.pat? Then, each time there's a change (or maybe each time one clicks a certain button, or perhaps based upon a timer), a new read of the current state of the patcher is saved to yourpatch_2, _3, etc. (which would then be the current state).
Then through a keystroke or clicking, the previous states of your patch would be loaded. It certainly wouldn't be as slick as an undo that's incorporated at the program level, but it might give some leeway. When you're done for the moment, save the patch with a new name so that the next time, the undo files will be using that new name. One could automatically delete the undo files upon closebang, or do it manually if you're leery...
Probably there's reasons why this wouldn't work, but I read stuff about filein etc. in C, and am wondering whether it could work.
Undos with tables and multisliders etc. are doable using coll, and quite useful, but that's of course only part of the patch. It would be great to extend the overall Undo function of Max without having to manually save versions with new names all the time.