Array of hosted games
Same dude, same code, same review (except I noticed hostingGames is not an object like I assumed in the first answer).

Never use for-in on arrays. You risk looping through properties in addition to the array items. Use a regular for loop with indexes, or better, array methods.

And when splicing an array multiple times, it's best you do it in reverse. You risk skipping items when you do it forwards.

Also, it's best not to leave any holes in the array. From a developer that knows nothing about the context of your app, why are they empty? Especially when cancelHostGame splices cancelled games?

server.em.addListener('cancelHostGame', function(userId, userName){
  for(let i = hostingGames.length; i--;){
    let game = hostingGames[i];
    if(!game || game.userId !== userId) continue;
    hostingGames.splice(i, 1);
  }
});


Now the first part of your code is somewhat different from the first review. But the advice from the first review still applies.

However, you've introduced the concept of "slots". But in reality, all your code does is limiting the number of hosted games. Slots is just an abstract way of putting it. A much easier approach is to just check if the hosted array length is at the limit. If not at the limit, just push to the array.

server.em.addListener('hostGame', function(settings){

  const slotsMaxed = hostingGames.length === MAX_SLOTS;
  if(slotsMaxed) return;

  const userHasGame = hostingGames.map(g =&gt; g.userId).includes(settings.userId);
  if(userHasGame) return;

  const hostGame = new HostGame();
  hostGame.initialise(settings.userId, settings.userName, settings.boardSize, settings.gameMode, settings.gameNote);
  hostingGames.push(hostGame);
  server.updateGamesList(hostingGames);

  server.consoleLog('APP', `${settings.userName} is hosting a game. ID: ${settings.userId}`);
});