Efficiently snap-shotting state is possible and not too hard in MobX, as demonstrated in the demo of my Reactive2015 talk. A future version of MobX (or the devtools) will probably even have a standardized approach to this.
If you start to build undo/redo you will soon discover that undo/redo is often a lot more than just 'snapshotting'. Two other aspects play an important role in undo/redo: transactions (actions of a user might be consist of multiple smaller actions) and side effects (you don't want to undo just the client state, but also revert data that was already sent to the server).
So for that reason I would use snap-shotting as debug utility, but command apply / unapply if you need complex undo / redo patterns.