The crux of your problem is that your code assumes that OBR and OBX segments will always appear in pairs.
OBR|1|...
OBX|1|...
OBR|2|...
OBX|1|...
OBR|3|...
OBX|1|...
However, as soon as you run into a case where the numbers of OBR and OBX segments don't match, or don't appear in strictly alternating fashion, things start to break.
OBR|1|... oh oh, this obr is followed by two obx segments
OBX|1|...
OBX|2|...
OBR|2|... oh oh, this obr isn't followed by an obx segment at all.
OBR|3|...
OBX|1|...
You need to first understand what is meant by the following lines of code.
var obrSegments = msg['OBR'];
var obxSegments = msg['OBX'];
In this example, obrSegments is an array of, you guessed it, obr segments. Similarly, obxSegments is an array of obxSegments. Neither of these arrays were constructed with any awareness of how the obx segments were positioned with respect to the obr segments.
If you can guarantee that the obr segments and obx segments in your message will always appear in strictly alternating fashion, then you can guarantee that obrSegments[i] and obxSegments[i] will always be sequential.
On the other hand, if the number of obr and obx segments isn't identical, or, even if the number IS identical, if the segments don't appear in a strictly alternating fashion, then there's no guarantee that obrSegments[i] will be immediately followed by obxSegments[i].
The phrasing of your question isn't 100% clear. However, I am inferring that whenever you examine the contents of an OBR, you then want to conditionally change the contents of ALL obx segments that immediately follow it.
I recommend something more like this.
var obrSegments = msg['OBR'];
// iterate through the OBR segments
for each (var obr in obrSegments) {
// extract the field components that you need from this OBR
// don't assume I've done this correctly. The text of your
// question didn't match your example code, so I don't exactly know what you need
var OBR4_1 = obr['OBR.4']['OBR.4.1'];
var OBR4_2 = obr['OBR.4']['OBR.4.2'];
// now iterate through the OBX segments that immediately follow this OBR.
// This is a bit tricky to do, but here's how I approach the problem
// you need an XML list of all the segments, not just the current OBR
var segments = obr.parent().children();
// you need to know the current OBR's index in the segments list
var obrIndex = obr.childIndex();
// theoretically, at this point, obr should refer to exactly the same
// data as segments[obrIndex]
// to do the actual OBX iteration:
var nextIndex = obrIndex + 1;
while (nextIndex < segments.length()) {
var nextSegment = segments[nextIndex];
var nextSegmentType = nextSegment.localName();
if (nextSegmentType == 'OBX') {
var obx = nextSegment;
// Bearing in mind that I haven't tested this code and have just been spewing it
// off into my web browser,
// you can now be confident that variable obx refers to one of the obx
// segments immediately following variable obr.
if (OBR4_1 == blah blah blah) {
obx['OBX.5']['OBX.5.1'] = blah blah blah;
obx['OBX.5']['OBX.5.2'] = blah blah blah;
}
else {
// looks like we've finished processing all the OBX segments for the current
// obr, time to break out of the inner loop.
break;
}
++nextIndex;
}
}