Вы вытаскиваете коврик из-под ног.
foreach (SdtBlock sdt in sdtList)
{
sdt.Remove();
// Now what?
}
В точке комментария (хотя на самом деле она находится в скобках), sdt не существует, так как перейти к следующему, когда вы не знаете, где находитесь?
Решение состоит в том, чтобы работать в обратном направлении, или составить список и удалить их в конце. Работа в обратном направлении использует счетчик, который все еще существует, когда вы удаляете элемент, поэтому он все еще может повторяться.
foreach (int i = sdtList.Count() -1; i > 0; i--)
{
var sdt = sdtList[i];
OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
OpenXmlElement parent = sdt.Parent;
OpenXmlElementList elements = sdtc.ChildElements;
var mySdtc = new SdtContentBlock(sdtc.OuterXml);
foreach (OpenXmlElement elem in elements)
{
parent.Append((OpenXmlElement)elem.Clone());
}
sdtList.Remove(sdtList[i]);
}