Again, you cannot fix this reliably with xmodmap, you must use Xkb. Your solution will work as long as the interaction *in the X server* between Xkb and xmodmap is not disturbed (luckily for you, even the xorg devs are terrified of disturbing it...).
And again, this is not really an xmonad issue. You are fighting against the essential incompatibility between Xkb keymaps and xmodmap with respect to any modifier whose behavior is hardcoded into an Xkb keymap, a problem which has been known for years (the XFree86/xorg folks have tried to deprecate xmodmap many times since Xkb was added because of this incompatibility, but users won't use complex-looking Xkb mechanisms to e.g. swap caps lock and control keys).
This *cannot* be fixed in xmonad; the problem is happening in the guts of the keyboard driver in the X server, and by the time xmonad gets involved it's far too late to deal with it.