I dug into this a little and found that BlueOcean explicitly disables rendering sequential stages in parallel branches unless the build is a declarative pipeline run. So a quick and dirty workaround is to fake a declarative pipeline in a scripted one. Then arrange your stages similarly to what declarative would do (namely create a wrapper stage with the same name as each parallel branch), and it will be rendered nicely.
Needless to say, this is an ugly hack and might break in unforeseen ways. Though it seems to work in my tests, and the only side effect I saw was that a "Restart from Stage" option appeared in the build's menu, with an empty dropdown list. This seems benign enough, but I don't know what else it could cause, so be warned.
So how do you fake a declarative run? BlueOcean checks for an action of type ExecutionModelAction, so that's what we have to add:
currentBuild.rawBuild.addAction(new ExecutionModelAction(new ModelASTStages(null)))
This won't work in a sandboxed script, but it does in a global shared library. So it's probably not worth the effort (and potential risk) to make jobs with hand-written parallel-sequential stages render properly, but it might just be a workaround if you generate jobs with such a structure from library functions.