Looks like someone else noticed the same thing in another thread a few years ago. http://forums.roguetemple.com/index.php?topic=3491.0
Interesting. I have to comment on what Elwin said there...
Monsters getting a bonus is probably not a bug.
/*
* If the creature being attacked is not running (alseep or held)
* then the attacker gets a plus four bonus to hit.
*/
if (!on(*thdef, ISRUN))
hplus += 4;
If you look at the comment, it talks about: "creature", "asleep", "held". All those point that the bonus was meant to help the player against monsters primarily, and possibly not the other way around at all. The test against ISRUN flag is used a lot in the code handling monsters, but only a few times concerning the player, so I would not be surprised if whoever wrote that didn't know ISRUN flag would actually apply to the player and thus give monsters the bonus as well.
In conclusion, monsters getting the bonus when character is frozen could very well not actually be intended, but the fact monsters get this bonus all the time is almost certainly a bug, and definitively not justified as monsters were already deadly more than enough.
The Rogue devs extensively tested the game, and I doubt they accidentally made it substantially harder than they intended.
If it was only about monsters getting the bonus, and getting it all the time, but it's even worse than that, it's about player never getting the bonus at all. Clearly that was not intention, so it seems whoever wrote that didn't really have a clue what they were doing, and however extensive the testing, it was obviously not proper.
It's not kind of thing you would normally notice through play-testing having the game employ a very wide RNG range for most outcomes. It ought to had been tested within the code itself. I tested it by simply putting a print string command that would print on the screen "bonus" if the test passed and "no bonus" if it didn't. When monsters attack it always says "bonus", and when player attacks it always says "no bonus" even when when attacking sleeping ones. As I pointed out earlier, when looking in the code it is clear why is that so.