Во-первых, имейте в виду, что в целом, если вы удаляете объект из коллекции и у вас нет его ссылки, этот объект мертв в момент удаления. Поэтому, по крайней мере, вызов RemoveInternalChildRange является недопустимым после удаления, но это не основная проблема.
Во-вторых, у вас может быть небольшое состояние гонки, даже если оно не является строго многопоточным. Нужно проверить (с точкой останова), реагирует ли этот обработчик событий слишком активно - вам не нужно запускать обработчик событий, пока вы находитесь в процессе удаления, даже если это один элемент.
В-третьих, проверьте на нулевое значение после:
UIElement child = _generator.GenerateNext(out newlyRealized) as UIElement;
и для первой пробной версии измените код, чтобы получить корректный выход, что в данном случае означает, что gracefull continue - необходимо использовать для цикла и приращений в цикле, чтобы вообще иметь возможность продолжить.
Также проверьте InternalChildren, когда вы видите, что null, чтобы увидеть, дает ли этот путь доступа тот же результат, что и ваши _children (как в размере, внутренние данные, null в том же месте).
Если просто пропускается нулевое значение, сохраняется (рендеринг без исключений), сразу же после этого остановите его в отладчике и проверьте, были ли обработаны эти массивы / коллекции (нет нулей внутри).
Кроме того, опубликуйте полностью компилируемый пример проекта, который дает репродукцию (в виде zip-файла) где-нибудь - сокращает случайные предположения и позволяет ppl просто собрать / запустить и посмотреть.
Говоря о предположениях - проверьте, что делает ваша "наблюдаемая коллекция". Если вы удаляете элемент из коллекции, любой итератор / перечислитель из предыдущего состояния этой коллекции имеет право выдавать или давать нули и в пользовательском интерфейсе, который пытается быть слишком умным, имея устаревший итератор может произойти легко.