Boa tarde Fernando, isso acontece pois o JavaScript é uma linguagem de tipagem fraca, isso quer dizer que você consegue realizar comparações, atribuições e etc entre diversos tipos de dado e isso não retornará nenhum erro, por exemplo você pode comparar um booleano (true / false) com um inteiro.
No seu exemplo o que acontece é que você tem 2 expressões sendo executadas, a primeira é 18.5 <= imc
, isso vai te retornar um booleano, após isso o resultado dessa operação será utilizado para avaliar a segunda expressão, então se o imc for 19 por exemplo teremos o seguinte:
(18.5 <= 19) <= 35
true <= 35
true
isso acontece pois o JavaScript converte automaticamente o valor booleano em inteiro para realizar a comparação, o booleano true assume o valor inteiro 1, e o booleano false assume o valor inteiro 0, você pode atestar isso executando no console o seguinte código:
console.log(+true);
console.log(+false);
Por isso, não importa qual resultado a variável IMC tenha, sempre resultará em um true no final.
Você nunca deve realizar comparações dessa forma como você fez, sempre utilize os operadores lógicos, a expressão correta seria a seguinte:
if(imc >= 18.5 && imc <= 35) {
mostra("Seu peso está na média");
}
Espero ter ajudado!