One method is to use coalesce():
SELECT COALESCE( (Select money from Bank), -1)
The subquery might still be run twice (due to the semantics of COALESCE()) -- I'm not sure how Postgres optimizes this.
You can fix this by moving the logic to the from clause:
select coalesce(b.money, -1)
from (Select money from Bank) b
Note: This will not return any rows if Bank is empty. My guess, though, is that you have simplified the query and there are more conditions. If bank really has at most one row, then you can just use:
select coalesce(max(b.money), -1)
from bank b
If this is really a more complicated query, you might need a lateral join:
select . . ., coalesce(b.money, -1)
from . . . left join lateral
(Select money from Bank) b;