Puoi usare il primo SQL che hai scritto ma per tutti gli utenti:
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);
Questo potrebbe non essere il modo più veloce per ottenere il risultato, ma ti darà ciò di cui hai bisogno. Uso query simili in diversi punti della mia app.