Para responder à pergunta direta de por que ele muda, o bug está na rotina de otimização "JIT" do mecanismo V8 JS usado pelo Chrome. No início, o código é executado exatamente como escrito, mas quanto mais você o executa, mais potencial existe para que os benefícios da otimização superem os custos da análise.
Nesse caso, após a execução repetida no loop, o compilador JIT analisa a função e a substitui por uma versão otimizada. Infelizmente, a análise faz uma suposição incorreta e a versão otimizada não produz o resultado correto.
Especificamente, o usuário do Reddit RainHappens sugere que é um erro na propagação de tipo :
Ele também faz alguma propagação de tipo (como em quais tipos uma variável etc pode ser). Existe um tipo especial "indetectável" para quando uma variável é indefinida ou nula. Nesse caso, o otimizador torna-se "nulo é indetectável, portanto, pode ser substituído pela string" indefinida "para a comparação.
Este é um dos problemas difíceis com a otimização do código: como garantir que o código que foi reorganizado para desempenho ainda terá o mesmo efeito que o original.