my main motivation was to separate the things that the framework needs, from whatever an application needs. The framework needs a String representation of the aggregate identifier. While most applications use a UUID-as-a-String, that is not the case for all of them. I have seen many cases where rich identifier classes were used (mainly to be more expressive about the meaning of an ID). It is considered a good practice by many.
The fact that Axon stores is besides the event payload, is purely for indexing reasons. Axon needs to be able to fairly quickly look up the events of a specific aggregate. In a relational database, the (only?) solution is to store that field separately and index it.
My 2 cents.