It's a good question, and your suggestion is one possible alternative to the standard scheme. Another would have been to use template template parameters:
template<typename T>
class AnAllocator
{ ... };
template<typename T, template <typename> class Alloc = std::allocator>
class Vector
{
typedef Alloc<T> allocator_type;
...
};
Vector<int, AnAllocator> v;
The allocator interface was designed before template template parameters were part of the language, so that wasn't an option.
There are lots of things that would be done differently if the allocator API were to be designed today, unfortunately we're stuck with the one we have (and the continuing complexity caused by trying to extend it in semi-compatible ways).