В IDLE 3.9.2 пишу следующий код:
import msvcrt
import sys
while True:
if msvcrt.kbhit():
key = msvcrt.getch()
if ord(key) == 27: sys.exit()
print(ord(key))
Я детали реализации IDLE не знаю, но это связано с тем, что sys.exit завершает процесс.
В консоли вы запускаете новый python-процесс, в IDLE скорее всего не так, поэтому sys не корректно работает.
Для проверки этой гипотезы я выполнил запуски простого кода:
>>> import sys
>>> sys.exit()
В idle, командной строке виндовс и убунту.
В командных строках, ожидаемо, меня выбило из оболочки python. А в idle код был проигнорирован.
Ваш код коректно работает, на idle не обращайте внимание.