Eu acho que a questão é similar ao caso do teclado QWERTY. Pode não ser o ideal, não faz sentido em muitos contextos (a disposição das teclas leva em conta, entre outros fatores, a frequência de cada caractere, então para muitos idiomas ele é o menos ideal), mas está tão disseminado e as pessoas já se acostumaram tanto a ele, que tentar criar outro padrão só deixaria tudo mais confuso (até existem teclados alternativos, mas exigem adatapção e no fim o QWERTY ainda é dominante).
Na maioria das linguagens mainstream, o primeiro índice é zero. Muita gente já se acostumou com isso, e qualquer coisa diferente acaba ferindo o princípio da menor surpresa. Provavelmente é influência do C (que tinha motivos práticos pra ser assim), e/ou também do famoso artigo do Dijkstra. Tem uma discussão interessante aqui também.
Admito que o primeiro índice ser zero causa um estranhamento na primeira vez que vc vê (assim como o teclado QWERTY), mas depois que acostuma, passa a ser "natural".
E talvez as pessoas que criam linguagens simplesmente adotam esse mesmo padrão por estarem acostumadas e não haver motivos práticos para mudar algo tão disseminado na área.
Quanto ao erro de off-by-one mencionado, é algo que pode ser facilmente contornado. A maioria das linguagens atuais possuem loops que percorrem os elementos de array sem precisar dos índices (
foreach
,for..of
, etc).
Claro que quem for criar uma linguagem pode definir do jeito que quiser. Mas para fazer algo diferente do que a maioria faz (ainda mais se for algo tão disseminado), tem que ter uma boa justificativa. Se as pessoas vão comprar sua ideia ou não, é outra história.