Вот же, проблема!
Яваскрипт однопоточный, и код с таймаутом запустится только тогда, когда пройдет нужное время и никакой код не будет выполняться.
Т.е., даже если поставить таймаут на 0, он выполнится всегда после того, как отработает функция, вызвавшая это отложенное выполнение. Таким образом, кстати, можно проверять значение value у инпута
сразу после keypress.