El .aggregate() el método siempre devuelve Objects no importa lo que hagas y eso no puede cambiar.
Para su propósito, probablemente sea mejor que use .distinct() en cambio, que simplemente devuelve una matriz de valores distintos:
db.users.distinct("emails.address");
Cuál es exactamente el resultado deseado:
["example@sqldat.com","example@sqldat.com","example@sqldat.com"]
Si realmente quieres usar .aggregate() luego, la transformación a solo los valores debe ocurrir "fuera" de la expresión en el procesamiento posterior. Y también deberías usar $unwind cuando se trata de arreglos como este.
Puede hacer esto con JavaScript .map() por ejemplo:
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Lo que da el mismo resultado, pero .map() hace la transformación del lado del cliente en lugar de en el servidor.