I don't think there is any bug here. mIRC just defines "isupper" and "islower" differently than you were expecting. In particular, the following two lines will always give the same result, and you can think of the first line just being a shortcut for the second line:

if (%c isupper) { ... }
if (%c === $upper(%c)) { ... }

Assuming you want the same behavior you get with regex, and if you are working with a variable %c that contains a single character, you can use:

if ($asc(%c) isnum 65-90) { echo -a %c is an uppercase letter }
if ($asc(%c) isnum 97-122) { echo -a %c is a lowercase letter }

I'm not sure if there is a more efficient way, though.