Cara, refutando um pouco do uriel, e trazendo um pouco sobre como uma linguagem de programação funciona, acredito ser por um cache de:

item.name.toLowerCase().indexOf(`lars`)

Assim como uma aplicação, se você roda cru, o tempo demora mais, mas se essa função já foi executada antes, a linguagem faz uma memoização dos resultados por um certo tempo para melhorar o desempenho e velocidade. Veja, você usa esse trecho na primeira, o código executa e guarda um cache, e na segunda, já tem o resultado que você espera receber!

Faz muito sentido isso!

Afinal, eu estou percorrendo o objeto results duas vezes.

Obrigado pela resposta

Até onde sei, as engines não fazem memoização por *default*. Geralmente é algo que vc faz à parte, já que a engine em si não tem como garantir que a função é pura (sem efeitos colaterais), pois aí memoização não é indicado. Tem que ver também o tamanho do array e os valores que ele contém, pode ter influência no resultado (para poucos dados, costuma ter mais distorções que desaparecem em datasets maiores). É verdade que muitas engines usam alguma forma de [JIT](https://pt.stackoverflow.com/q/146250/112052) que pode fazer inline de funções e acelerar o processo. Mas isso só costuma acontecer se for executado muitas vezes, então se o array for pequeno, o efeito é mínimo ou até mesmo nulo. Ou seja, meu palpite é que isso não seja a principal causa da diferença. Sugiro testar com o Benchmark.js ou outra lib similar, para ter resultados mais "limpos" que `console.time`.

Não me refutou, o que você disse não muda o que eu disse em nada, nem uma virgula!

Cada runtime e engine tem suas particularidades e foi isso que eu disse pra ele!