Muito obrigado pelo tempo gasto nesta explicação. Esclareceu minha dúvida e trouxe muito mais conteúdo... Valeu!

Então, acho quer meu método de medição não foi o mais preciso, utilizei o console.time() e o console.timeEnd().

Então, testei assim:

function fatorial(n) {
    if (n == 1 || n == 0)
        return 1;
    return n * fatorial(n - 1);
}

function fatorial_acc(n, acc = 1) {
    if (n == 1 || n == 0)
        return acc;
    return fatorial_acc(n - 1, n * acc);
}
const n = 100;

console.time();
fatorial(n);
console.timeEnd();

console.time();
fatorial_acc(n);
console.timeEnd();

Ele diz que fatorial é mais lento. Mas se eu inverter a ordem (chamar fatorial_acc primeiro), ele vai dizer que esse é o mais lento. O primeiro a ser chamado é mais lento, independente da ordem, provavelmente porque no início tem também a inicialização do runtime, warmup do JIT, sabe-se lá mais o que o Node.js deve fazer na carga inicial.

Aliás, se eu fizer algo assim:

for (var i = 0; i < 30; i++) {
    console.time();
    fatorial_acc(n);
    console.timeEnd();
}

Ou seja, chamo a mesma função várias vezes. Mesmo assim, a primeira execução sempre é mais lenta, pelo mesmo motivo. No meu caso, o resultado foi:

default: 0.434ms
default: 0.027ms
default: 0.038ms
... as demais foram abaixo de 0.1ms

E se eu mudar o for acima para chamar somente fatorial, o resultado é o mesmo: a primeira é bem mais lenta.

Por isso é melhor usar ferramentas que desconsideram esses fatores externos (como eu fiz com o Benchmark.js, por exemplo).