If I understand what you are trying to do, random thought:
1. Create a single pline that overlays the existing plines and follows the backbone for its entire length. Reverse the pline if necessary so that it starts at the correct end.
2. Use vlax-curve-getClosestPointTo on each block to get the apparent intersection with the working pline, then get the distance along the working pline from the pline start point to the apparent intersection. Store the data in an array so that the block data and the distance along the working pline are kept together.
3. Determine if each block is to the left of the working pline, on the pline, or to the right of the pline. Add to the data set for the block in the array.
4. Sort the array based on distance of the apparent intersection from the pline start point, closest to start point first.
5. Iterate through the array. For points on the left or on the line offset the pline to the left. Keep a running counter so you can step the offsets by (N * offset distance). Drop a line from the block to the offset pline. Trim out the excess offset pline. Same process on the right, but with a different counter and offsets to the right.
6. Do whatever is necessary to clean up at the start point.