Eu recomendo que não use switch(true). Só porque algo “funciona”, não quer dizer que seja o certo. switch é excelente para avaliar um único valor, mas usá-lo assim para avaliar condições é um uso torto. Até porque dá pra ser bem mais simples com if/else:
var peso = parseFloat(window.prompt("Digite o seu peso (Use o ponto para casas decimais ao invés da virgula)"));
var altura = parseFloat(window.prompt("Digite a sua altura (Use o ponto para casas decimais ao invés da virgula)"));
if (isNaN(peso) || isNaN(altura)) {
alert('Você deve digitar números');
} else if (peso <= 0 || altura <= 0) {
alert('Peso e altura devem ser positivos');
} else {
var imc = peso / Math.pow(altura, 2);
// como eu validei peso e altura antes, aqui eu sei que IMC sempre é positivo
var msg;
if (imc < 17) {
msg = 'Você está muito abaixo do peso';
} else if (imc < 18.5) {
msg = 'Você está abaixo do peso';
} else if (imc < 24.5) {
msg = 'Você está com o peso normal';
} else if (imc < 30) {
msg = 'Você está com sobrepeso';
} else if (imc < 40) {
msg = 'Você está com obesidade';
} else {
msg = 'Você está com obesidade grave';
}
alert(`${msg}, seu IMC é ${imc}`);
}
Primeiro eu valido se foi digitado mesmo um número (tento converter com parseFloat e vejo se o retorno é NaN), e também vejo se o valor é um número positivo, assim eu garanto que o IMC não será negativo.
Depois, troquei o switch por if/else, que fica mais simples. No primeiro if vejo se é menor que 17. Se não for, ele vai pro else if, e se chegou aqui é porque com certeza não é menor que 17, então não preciso verificar isso de novo: basta ver se é menor que 18.5. Se não for, ele cai no próximo else if e eu não preciso verificar de novo o 18.5, basta verificar a outra condição.
Por fim, se chegou no último else é porque é maior ou igual a 40, então nem if precisa.
Agora imagine que você quer colocar mais alguma condição no meio (por exemplo, entre 35 e 40). Bastaria adicionar mais um else if (imc < 35) antes do else if (imc < 40). Já no switch você teria que mudar em 2 lugares, já que você testa o valor inicial e final de cada intervalo (ou seja, além de ser um uso torto, ainda dá mais trabalho).
Outro detalhe é que você testa imc <= 18.4, então se o IMC for 18.41 ele não entra nesse caso e nem no imc >= 18.5. Eu preferi colocar imc < 18.5, pois aí mesmo se for 18.49999, ainda entra neste if.