beh, perché le regexpr che hai scritto dice:

"Dall'inizio della stringa, cerca un sottoinsieme di 2 caratteri e controlla che siano numeri, poi, dopo un ":", cerca un altro sottoinsieme di due caratteri e controlla che siano numeri, assicurati poi che la stringa finisca alla fine del secondo sottoinsieme."

Proprio per questo valida tutti i numeri a 2 cifre.

L'unico modo sicuro per farlo è utilizzare prima la regexpr che stai usando e, se supera il test, fai:

codice:
   //metti di avere in str il value inserito dall'utente
   //ha già superato la tua regexpr
   var splitted = str.split(":");
   var hour = parseInt(splitted[0]);
   var minute = parseInt(splitted[1]);
   return (!isNan(hour) && !isNan(minute) && hour < 24 && hour >= 0 && minute < 60 && minute >= 0);
Dovrebbe andare