It is for optimization purposes. We could implement all? on top of the reduce but that would imply dispatching to the protocol, then to the implementation and then process the reduce operation. So we skip all of that by dispatching to the local implementation.
Another way to put it: sometimes you will find non-idiomatic code in Elixir codebase so *you* don't have to write non-idiomatic code. :)
The other (possibly conflicting) idea is that those could be part of the protocol itself but that would make the protocol unnecessarily large. I do expect the Enumerable protocol to grow though at some point, specially if we end-up implementing a queue/array/vector abstraction.