não li os comentários mas já vou dar meu pitaco, principalmente sobre isso aqui:
índice != comprimento
Acho que o grande ponto se resume em entender que são duas coisas diferentes. Enquanto o índice representa as unidades lógicas do troço que você ta iterando, o comprimento representa as unidades reais do troço.
Você ta iterando sobre os índices mas navegando entre o comprimento, como são duas coisas diferentes, é normal que deva haver o decremento do comprimento para fazer a iteração pelos índices da string.
Alternativamente, o que deveria haver ao contrário dos índices começarem por 1, é haver uma função que retorna a quantidade de índices da string assim como existe para o comprimento dela, que aí você iria iterar sobre os índices navegando entre os índices da string.
Algo como isso:
let alfabeto = "abcdefghijklmnopqrstuvwxyz";
for (let i = 0; i <= alfabeto.indexLength; i++) {
console.log(alfabeto[i]);
}
Isso manteria cada um com sua função e facilitaria quem ainda não pegou a ideia de que são coisas diferentes.