If a TabBar is not given an overridden value of implicitWidth, the process of removing tabs will hang the process. This appears to be a binding loop in the calculation of implicitWidth.
Fixing the width of the TabButton, the implicitWidth of the TabBar, or aloowing a ColumnLayout to override the width via Layout.fillWidth all seem to avoid this problem. See comments in main.qml (which demonstrates the hang) for the different things I tried.
As I'm not sure how to relate callstacks when interrupting it in C++ to the JS binding code, I wasn't able to pin it down any more.
Hang occurs with the Default and Material styles, Universal looks strange but doesn't seem to have the same infinite loop.