Assuming that it is your code that is calling dispose directly, probably the cleanest solution would be to handle the expression creation explicitly at the point that you call dispose (in addition to creating the expression in your event handler, for the UI initiated deletions).
Another solution would be to use an event handler as you are and also look back in the undo stack for immediately preceding move events of the same block in the undo stack, regardless of group ID. This is a bit brittle, because I don't think that Blockly promises not to change the set of events created by calls to dispose. But then again I'm not sure that they promise not to do so for UI initiatives deletion either, so maybe it's not so bad.
By the way, in case you don't know about it the Blockly Advanced Playground is a great tool for, among other things, playing around with Blockly and seeing the event stream. Just enable the "Log Events" setting near the bottom of the settings panel (in the upper right of the display). The events will then be printed in the browser console log.
Hope this helps.