Vous pouvez utiliser le premier SQL que vous avez écrit mais pour tous les utilisateurs :
SELECT u.*, b.balance, b.date
FROM users u JOIN balance b ON u.id = b.userId
WHERE b.date = (SELECT MAX(date) FROM balance WHERE userId = u.id);
Ce n'est peut-être pas le moyen le plus rapide d'obtenir le résultat, mais cela vous donnera ce dont vous avez besoin. J'utilise des requêtes similaires à plusieurs endroits dans mon application.