I've been bitten by this same issue where kill-buffer / replace-buffer-in-windows doesn't take available tab-bar tabs into consideration as viable replacement windows to restore when quitting the last window on a frame. I looked at 29+, 30, 31 window.el/.c and tab-bar.el and I can't find if this was resolved or if there was a recipe to avoid this.
I've resorted to wrapping kill-buffer using a custom function, not advice, to inhibit deleting the frame.
Do any of you recall if this bug was addressed and how? If not, may I assist in some way?
-Stephane