I can confirm this happens as well, below are a few tests i ran;

mIRC 7.23 beta, Win7 32bit

Using versions <= 7.22, you could just use the on RAWMODE event with a haltdef to display a custom echo for modes,
and this would cover all the modes with out having to setup a haltdef on every mode event,
eg: on VOICE, on HALFOP, on OP, on OWNER, on BAN, etc..

In the 7.23 beta version is seems you have to halt/haltdef every mode event or you will get a double echo when using the on RAWMODE event.
below is a very basic script i used to test this;

Code:
 on ^*:RAWMODE:*: {
  echo $color(mode) -pt $chan RAWMODE: -> $nick -> $1 $2-
  haltdef
}


As i said, in previous version this was all that was needed for a custom echo line, now you have to add the following;

Code:
on ^*:mode:*:haltdef
on ^*:op:*:haltdef
on ^*:owner:*:haltdef
on ^*:voice:*:haltdef
on ^*:deop:*:haltdef
on ^*:deowner:*:haltdef
on ^*:devoice:*:haltdef

As this being the case, it does not account for the +/-a mode (&) that some servers have, most noteably, UnrealIRCD.
Documents on this can be found here; http://www.unrealircd.com/files/docs/unreal32docs.html#userchannelmodes
To quote the doc: "a <nick> - Makes the user a channel admin"

Below is a debug and channel echo output from 7.22 and 7.23 beta;

;---------------------------------
;-- mIRC 7.22
Code:
-> irc.someirc.tdl MODE #Lobby +o nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby +o nosceteipsum
-> irc.someirc.tdl MODE #Lobby -o nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby -o nosceteipsum
-> irc.someirc.tdl MODE #Lobby +a nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby +a nosceteipsum
-> irc.someirc.tdl MODE #Lobby -a nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby -a nosceteipsum
-> irc.someirc.tdl MODE #Lobby -ao nosceteipsum nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby -ao nosceteipsum nosceteipsum
-> irc.someirc.tdl MODE #Lobby +ao nosceteipsum nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby +ao nosceteipsum nosceteipsum


And the actual echo output;

Code:
[21:35 12] RAWMODE: -> Smeagol -> +o nosceteipsum
[21:35 19] RAWMODE: -> Smeagol -> -o nosceteipsum
[21:36 21] RAWMODE: -> Smeagol -> +a nosceteipsum
[21:36 23] RAWMODE: -> Smeagol -> -a nosceteipsum
[21:38 20] RAWMODE: -> Smeagol -> -ao nosceteipsum nosceteipsum
[21:38 50] RAWMODE: -> Smeagol -> +ao nosceteipsum nosceteipsum


;---------------------------------
;-- mIRC 7.23 beta
Code:
-> irc.someirc.tdl MODE #Lobby -o nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby -o nosceteipsum
-> irc.someirc.tdl MODE #Lobby +o nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby +o nosceteipsum


And the actual echo output;

Code:
[21:45 11] RAWMODE: -> Smeagol -> +o nosceteipsum
[21:45 11] * Smeagol sets mode: +o nosceteipsum
[21:47 14] RAWMODE: -> Smeagol -> -o nosceteipsum
[21:47 14] * Smeagol sets mode: -o nosceteipsum


Now, as i said above, you can add the haltdef to all the other mode events, and it echos correctly, except for the +/-a mode.

which will still result in the following;

Code:
[21:49 14] RAWMODE: -> Smeagol -> -a nosceteipsum
[21:49 14] * Smeagol sets mode: -a nosceteipsum


Note: If you use more than one mode in the command eg; '/mode #chan +ao Nick Nick',
It echos just fine. Provided of course you are using the extra mode event haltdefs.

Code:
-> irc.someirc.tdl MODE #Lobby -ao nosceteipsum nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby -ao nosceteipsum nosceteipsum
-> irc.someirc.tdl MODE #Lobby +ao nosceteipsum nosceteipsum
<- :Smeagol!Test@192.168.0.4 MODE #Lobby +ao nosceteipsum nosceteipsum


and the actual echo;

Code:
[21:56 19] RAWMODE: -> Smeagol -> -ao nosceteipsum nosceteipsum
[21:56 26] RAWMODE: -> Smeagol -> +ao nosceteipsum nosceteipsum



Not really sure what else i can add to this, let me know if there is.
I can normally be found in #mIRC on DALnet if you have any questions about how i tested it.

- Tw|tch

;-----