In the given scenario, serialization occurs twice in the last three lines, and it is a cause of an observed scenario.
A better way to approach this could be using of Map<String, Object> instead of Map<String, String> and perform serialization once. It would works since any entity is an Object.
Map<String, Object> mapToSerialize ...
Your map is most likely reaching the lightning component. Did you check the console.log output in the browser ? Please put the output here for more clarity. If all is well, you should be able to see the Map ...
Just use get method as you would on SObject.
AggregateResult aggregateRecord = aggregates.get(...);
Date aggregateValue = (Date)aggregateRecord.get('dateMax');
If you hadn't given the field an alias, it would instead be .get('expr0').