Eu usaria uma função de janela:
select *
from (
select u.*, dense_rank() over (order by balance desc) as rnk
from users u
) t
where rnk = 2;
Eu não acho que haverá uma grande diferença de desempenho para sua consulta (especialmente não com um índice em
balance
), mas na minha opinião é mais fácil de ler e manter.