Scanning is most certainly done concurrently with ZGC. Even root scanning is on its way to become fully concurrent, which is why we're nearing the goal of <1ms latency.
How does root scanning work wrt to Loom? Are stacks of virtual threads treated as roots? I guess there is no other option?