Как обернуть данные из колбэков в массив?
Решение 0xD34F имеет сложность O(n2) из-за использования метода every
Если это тестовое задание, могут и придраться, так как обычный счетчик позволяет решить со сложностью O(n)
function getUsersInfo(ids, callback) {
  const {length} = ids;
  const results = Array(length);
  let doneCount = 0;
  ids.forEach((id, i) => {
    getUserInfo(id, user => {
      results[i] = user;
      doneCount++;
      if(doneCount === length) {
        callback(result);
      }
    });
  });
}
Ну и замечу, что Promise.all в v8 под капотом использует именно такой подход (разве что подсчет ведут от length к 0):
https://github.com/v8/v8/blob/master/src/builtins/...
В коллбеке получения одного элемента данных после его записи в массив результатов проверять, что получено всё - если да, тогда вызывать общий коллбек:

function getUsersInfo(ids, callback) {
  const results = [...Array(ids.length)];

  ids.forEach((n, i) => {
    getUserInfo(n, user => {
      results[i] = user;

      if (results.every(Boolean)) {
        callback(result);
      }
    });
  });
}