Olá Caio tudo bem?
O While é uma estrutura de repetição e nesse caso você está utilizando para percorrer as posições do seu array listaDeDestinos, bom basicamente a sua variável contador como está sendo utilizada indica que, a cada repetição do laço você vai acessar uma posição do seu array. Quando trabalhamos com arrays, para acessar o conteúdo em uma posição desse array utilizamos os colchetes. Exemplificando:
const listaDeDestinos = new Array("Salvador", "São Paulo", "Rio de Janeiro") -> Aqui temos um array com 3 posições: 0,1 e 2
Para acessarmos o valor "São Paulo", devemos buscar a segunda posição do array, logo o código ficaria assim -> listaDeDestinos[1]
Para buscar "Salvador" -> listaDeDestinos[0]
Por fim "Rio de Janeiro" -> listaDeDestinos[2]
Então, no seu caso, o que "[contador]" faz é exatamente o exempllificado acima, já que o valor de "contador" é sempre um inteiro. Exemplificando com a sua lógica:
1ª Execução do while:
contador vale 0 logo, listaDeDestinos[contador] vai retornar "Salvador" e comparar com a variável "destino" (Nesse caso o laço acabaria por Salvador ser igual a destino mas vou continuar pra exempificar);
Depois na linha contador = contador + 1, contador incrementa +1 e passa a valer 1;
2ª Execução do while:
contador vale 1 logo, listaDeDestinos[contador] vai retornar "São Paulo" e comparar com a variável "destino";
Depois na linha contador = contador + 1, contador incrementa +1 e passa a valer 2;
3ª Execução do while:
contador vale 2 logo, listaDeDestinos[contador] vai retornar "Rio de Janeiro" e comparar com a variável "destino";
Depois na linha contador = contador + 1, contador incrementa +1 e passa a valer 3.