Pure関数の動作について認識する必要があります
GetAllChildrenはPure関数であるため、呼び出されるごとに評価を行い、最新の情報を返します
今回の場合だとForEach中にRemoveChildで子WidgetをRemoveしており、GetAllChildrenはそれを反映した最新の情報を返すため、ForEachループが回るごとに対象の配列サイズが小さくなっていきます
そのため、配列要素数がForEachマクロ内部のIndexを下回り、ループが打ち切られます
開始時点の要素数を2とすると、下記のような動作になります
1回目:ArrayIndex=0, 要素数2(LastIndex=1) -> Removeが実行されて要素数が-1
2回目:ArrayIndex=1, 要素数1(LastIndex=0) -> ArrayIndexがLastIndexを上回ったのでRemoveはせずComplete
GetAllChildrenの結果全てに対してForEachを実行したい場合は、一度変数に保存して、ループ前時点のすべての情報を確保する必要があります