Oi Guilherme!
A função .toFixed(2) só pode ser chamada em um número e retorna uma string que representa o número com a quantidade de casas decimais informadas como parâmetro.
Como a função calculaImc() já executa o comando imc.toFixed(2), o que é retornado já é uma string na forma que queremos. Sendo assim, não é necessário chamar o .toFixed(2) em outras partes do código, como na linha tdImc.textContent = imc.toFixed(2).
Na verdade, esse comando dá um erro pois, como neste caso o imc é uma string e não um número, o programa acaba retornando 0.
No código acima, adicionei um try-catch para verificar se algo estava errado com o .toFixed(2) no seu código e no console do chrome essa foi a mensagem:
  
Como dito anteriormente, como calculaImc retorna uma string, chamar .toFixed() no imc resulta em um erro.
Espero ter ajudado! Se tiver mais alguma dúvida pode postar aqui! :)