The comment here is not entirely correct: https://github.com/bitcoin/bitcoin/blob/4bfef0daeb9351c200b5bd09e60596a29b4d3523/src/qt/walletmodel.cpp#L71-L74
The problem happens when the locks are held and calculating the balance takes a lot of time - causing the GUI to stuck.
Beside the obvious improvement - drop polling and update only when necessary - the actual balance calculation must be asynchronous otherwise Qt’s event loop isn’t able to make the GUI smooth - noticeable on big wallet. This also applies for anything that takes a lot - whether it requires other locks or not.