i think, because software is built up abstractions over abstractions, its unavoidable such details creep into languages from the depths of the system. its not too long ago people didnt even have C or such high level constructs. so coming from there and building up its logical. Now, making something new, from above, one might put 1 as an index for the first element, but its likely during writing of a language you'll end up in the depths and come up with 0 anyway.
think of how a 1 index will work vs a 0 index on ptrs. (pseudo code)
ptr += index x size_of_object
ptr += (index-1) x size_of_object
if you wanna run that on the cpu, either compiler needs to come up with the first one or it will have an additional sub or decrement?
or do you want the compiler to have a duty of doing the index-1, it will result in the original code again, also possible. it will take extra compiler or interpreter time.
(or am i missing something completely?)