Para responder a la pregunta directa de por qué cambia, el error está en la rutina de optimización "JIT" del motor V8 JS utilizado por Chrome. Al principio, el código se ejecuta exactamente como está escrito, pero cuanto más lo ejecuta, más posibilidades hay de que los beneficios de la optimización superen los costos del análisis.
En este caso, después de la ejecución repetida en el bucle, el compilador JIT analiza la función y la reemplaza con una versión optimizada. Desafortunadamente, el análisis hace una suposición incorrecta y la versión optimizada no produce el resultado correcto.
Específicamente, el usuario de Reddit RainHappens sugiere que se trata de un error en la propagación de tipos :
También hace algún tipo de propagación (como en qué tipos puede ser una variable, etc.). Hay un tipo especial "indetectable" para cuando una variable no está definida o es nula. En este caso, el optimizador pasa a "nulo es indetectable, por lo que se puede reemplazar con la cadena" indefinida "para la comparación.
Este es uno de los problemas difíciles con la optimización del código: cómo garantizar que el código que se ha reorganizado para el rendimiento seguirá teniendo el mismo efecto que el original.