What you originally quoted was, "Arrays can be accessed with arbitrary numeric expressions. They do not have to be compile-time constants (though there are a few exceptions to this rule; for example, the very next section)." Then you said, "They are valid from 4.00 for opaque types."
Your original statement said nothing about expressions being dynamically uniform. Your statement was misleading, suggesting that "arbitrary numeric expressions" are "valid from 4.00 for opaque types." I just wanted to clear that up in case anyone got the wrong idea.
Yes, in his example, his loop is dynamically uniform. But he's not using an opaque type, so that's irrelevant: arbitrary numeric expressions should work on non-opaque types, regardless of GL version.