Yeah, that definitely seems to match, exactly as far as I can tell. What I had was almost the equivalent using a for loop. But your version with the while loop matches it exactly. One thing I wasn't happy with about the for loop was the jmp to the top of the loop without executing the re-initialization code, which wouldn't happen in a for loop (the jmp I'm talking about is the redundant one, but its presence still suggests it isn't a for loop). A continue in a for loop would still execute the re-initialization bit, but not when its a while loop like how you've got it. So that solves that problem. It still feels like we're missing something though. The break followed by a continue suggests that something else is going on. Perhaps the original source had something different, maybe different keywords with slightly different behaviour, some optimisations might also be involved, but what you've got has to be the equivalent. It matches what the byte code is doing. I guess as long as what is generated is equivalent to the byte code, then it would be okay.
The extra jmp in the byte code is also unreachable, so it feels right in a way that the decompiled code also has unreachable code. But maybe the decompiler could drop it out to be cleaner? Without the continue, it is still equivalent. Maybe it could use the presence of it to determine that it isn't a for loop and then it ignores it after that.
Regarding for vs while loops, I noticed from the SQ5 decompiled scripts that they don't have any for loops in them. From what I can see, some of the while loops appear to be for loops in disguise.
Regarding your last point, it seems like there are a number of artifacts like the one you mentioned that the decompiler can probably ignore. I guess it has to know about them but can then ignore them once identified.