Massa sua dúvida! Acho que eu deixei em aberto essa parte mesmo...
Pensa comigo, quando você tem um SE NÃO (else), é porque você tem um SE (if), correto? É por isso que o erro só ocorre com o 37!! O SE NÃO se refere ao 37... Vamos ler o código pra ver se ficar mais fácil de entender:
Quando o contador é igual a 33:
Nesse caso, ao entrar no laço for e se deparar com o primeiro IF (contador==33), a sua função vai incrementar em +1 e ele vai pra 34, ok?
Depois disso, ele vai pro próximo IF... A sua função pergunta: é igual a 37? Se sim incrementa mais um, se não eu mostro o número. Resposta: Não! Então ele chama a função mostra(contador).
Quando o contador é igual a 37:
Aqui, quando entrar no laço for e se deparar com o primeiro if, nada vai acontecer, pois 37 é diferente de 33.
Depois disso, no segundo IF... A sua função pergunta: é igual a 37? Se sim incrementa mais um, se não eu mostro o número. Resposta: Sim! Então ele incrementa o número em +1 e itera para o próximo número, sem mostrar o número 38...
Para deixar isso mais claro, experimente inverter a ordem do seu código e primeiro fazer o if do 37, depois o do 33 seguido de um else... você vai verificar que agora o número que não aparecerá é o 34.
Uma outra maneira do seu código funcionar nos moldes que você escreveu, seria por exemplo remover o ELSE, mantendo apenas os IF'S para que incrementem em um quando fosse um número não desejado e mostrando o contador todas as vezes, dessa maneira:
<meta charset="UTF-8">
<script>
function mostra (frase){
document.write(frase);
document.write("<br>");
}
for(var contador = 30; contador <= 40; contador++) {
if (contador == 33 ) {
contador++;
}
if (contador == 37) {
contador++;
}
mostra(contador);
}
mostra("FIM");
</script>