Du kan använda den första SQL du skrev men för alla användare:
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);
Detta kanske inte är det snabbaste sättet att få resultatet, men det ger dig det du behöver. Jag använder liknande frågor på ganska många ställen i min app.