Since each function is asynchronous, it cannot know automatically when to progress to the next step in the series. Each series function take a callback as an argument that you need to call.
(doneCallback) ->
userClient.smembers "users", (err, list) ->
async.each list, (item, cb) ->
userClient.hgetall item, (err, user) ->
users.push user
// You also need to call 'cb' here.
cb();
, (err) ->
console.log err
// Add this to go to the next step after.
doneCallback(err)
Also depepending on what you are using users
for, you may want to use async.map
instead of async.each
to simplify the code.