Il .aggregate() il metodo restituisce sempre Objects non importa quello che fai e questo non può cambiare.
Per il tuo scopo probabilmente è meglio usare .distinct() invece, che restituisce semplicemente un array di valori distinti:
db.users.distinct("emails.address");
Qual è esattamente l'output desiderato:
["example@sqldat.com","example@sqldat.com","example@sqldat.com"]
Se vuoi davvero usare .aggregate() quindi la trasformazione ai soli valori deve avvenire "al di fuori" dell'espressione in post-elaborazione. E dovresti anche usare $unwind quando si ha a che fare con array come questo.
Puoi farlo con JavaScript .map() ad esempio:
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Che dà lo stesso output, ma il .map() esegue la trasformazione lato client anziché sul server.