This is an interesting read:
The following are my own observations.
The C designers took great care adopting the meaning of characters and constructs as they had been used for hundreds of years in regular written language. And doing so, they had to work with the quite limited subset of ASCII characters. In western language, more grouping characters are used in written text but these did just not make it into ASCII.
In regular language, the meaning of parentheses is providing side information without interrupting the main message. This makes sense when calling a procedure: the main message is the action to be performed and the sub-info are the arguments.
Curly braces are used for grouping. "This collection of words belong together, are to be set apart from the rest". So it makes sense to use them for blocks of code, compound statements.
Square brackets are used for insertions in text that were not part of the original, to clarify the original text and provide context. Or to indicate omission with ellipsis: [...]. "She [the queen] was not amused". In computer programming it makes a little sense to use the bracket for array indexing because it is a kind of context being provided. "Array? What array? Well, specifically that element." But even if the original meaning does not fully cover the use in a computer language, there aren't too many other options left in ASCII.
So I would say it is a combination of prior art and what was available at the time that lead to the use of square brackets for array indexing.
[edit because of Alex's comment]
According to this source, ASCII was introduced in 1963 and got governmental approval in 1968. Development of the C language did not start until 1969, according to this wiki. So it seems likely Mr. Ritchie kept an eye on this new widely supported standard called ASCII when picking his characters.
Please also see the other answer(s) making a case for Algol, "the mother of many languages", being a strong influence.