Essa escolha foi feita porque faz as operações de acesso aos elementos mais simples e eficientes. Em outras palavras, fica mais fácil e rápido calcular a posição na memória onde o elemento está guardado quando começamos a contar a partir de zero.
Essa ideia de começar a contar do zero também tem uma relação com a matemática discreta e com a teoria dos conjuntos. Mas, no final das contas, o importante é saber que os arrays começam em zero porque é mais prático e eficiente assim, e que essa é uma convenção adotada na maioria das linguagens de programação.
Por exemplo, se o primeiro elemento de um array estiver na posição de memória 1000, e cada elemento tiver um tamanho de 4 bytes, o endereço de memória do terceiro elemento (índice 2) pode ser calculado como 1000 + 2 * 4 = 1008. Se o array começasse em 1, o mesmo cálculo seria 1000 + (3-1) * 4 = 1008, o que seria mais complicado.