The issue with your code is that while looping through ModelSpace for each Curve, your code also explodes the Curve and adds the exploded new entities into ModelSpace, thus the seemingly endless loops. What you need to do is to do it in 2 steps: getting a list of target entities (Curve, in your case); then explode (and append the new entities into ModelSpace).
The code would be:
var curveIds=wModelSpace.Case<ObjectId>(); //Assume you are 100% sure all entities in ModelSpace is Curve!
foreach (var id in curveIds)
{
Curve curve=(Curve)tran.GetObject(.....)
// Do your explode/ZData handling worke
}
Or:
var curves=new List<Curve>();
foreach (ObjectId id in wModelSpace)
{
// Make sure only Curve is targeted
var curve=tran.GetObject(id, OpenMode.ForRead) as Curve;
if (curve!=null) curves.Add(curve);
}
if (curves.Count>0)
{
foreach (var c in curves)
{
// Do your explode/Xdata handling work
}
}
HTH