As suggested in the comments, async.map did the trick. Here's my final solution:
app.post("/user", function(req, res) {
var error = [];
if (!req.body.username) {
error.push("username_required");
}
if (!req.body.password) {
error.push("password_required");
}
async.map(error, function(error, callback) {
translate(error, req.language, function(text) {
callback(null, text);
});
}, function(error, results) {
res.send(results);
});
});