Oi Leandro, os números 33 e 37 não aparecem porque você chama a função mostra dentro desse if, o que esse if está dizendo é: Se o contador for diferente de 33 e 37 então mostra o contador. Pra ficar mais claro vamos simular esse while e o if.
O contador começa com 30 ai ele chega no while, no while ele vai verificar: 30 é menor ou igual a 40? Sim, então ele entra no while, dentro do while ele chega no if e então ele faz outra verificação: o contador (30) é diferente que 33? sim (true) e ele também é diferente que 37? sim (true), ambos os valores sendo true ele entra dentro do if e chama a função mostra que vai passar o valor do contador e assim mostrar na tela, então ele sai do if e soma mais um ao contador que passa a ser 31 e assim vai indo, certo?
Vamos dar um pulo aqui, o contador agora recebe 33. No while, 33 é menor ou igual a 40? Sim, entra no while. Chegando no if, o contador (33) é diferente que 33? Não (false) eles são iguais, contador é diferente que 37? Sim (true), mas já que usamos o && no if, para ele entrar dentro do bloco ambos os valores precisam ser verdadeiros, já que um dos valores são falsos ele não entra no if e apenas soma mais um ao contador que passa a ser 34 que vai fazer a verificação de novo no while, vai fazer a verificação de novo no if e assim até acabar a contagem.
Deu para entender? Qualquer coisa você pode abrir um tópico no fórum com a sua duvida.