Olá! Talvez eu tenha entendido sua dúvida errada, e, se não for isso, é só avisar que eu reformulo a explicação, mas vamos lá:
Quando você usa o operador '<=' ele vai executar o teste do while(ou seja, o teste da condição pra ver se vai entrar no loop ou sair) n+2 vezes. O n sendo o número que está em numeroMaximo. Isso porque essas duas testagens adicionais são o teste de quando contador está no limite de estar certo pro loop, que é quando contador tem o exato valor de numeroMaximo, por isso o '=' em '<=', e dá verdadeiro(já que o teste de quando o contador é 0 adiciona mais 1 teste). Já o segundo teste adicional é a testagem que dá que a condição é falsa e não executa mais o loop.
Acredito que o que tenha faltado pra atividade ficar completa e pra um entendimento melhor do que está acontecendo é um console.log(contador) antes de contador++. Isso vai te ajudar a entender como a variável se comporta a cada execução do loop antes de somar. No caso, a última impressão seria o valor em numeroMaximo, que seria o de contador que está igual. Mas depois desse console.log, existiria ainda mais um contador++, com a variável finalizando em numeroMaximo+1, o que para o loop já que não está dentro de <= numeroMaximo, e sim maior.
Acho que ficou um pouco extenso, mas tentei explicar tudo o que poderia estar causando sua dúvida. Abraço.