In our SDLC we typically work on the next two to three releases at the same time. For this we use branching and every release has their own branch. Once a release is deployed to production, the code is merged back to master as master always represents the production code base. The changes are also merged forward to the next open release branches so the changes of the current/last production release are not lost in the next release.
I see a lot of posts suggesting the concept of a "development" branch. How would one use a development branch in conjunction with multiple concurrent releases, especially since the development branch is single threaded?
The development branch is generally reserved for the next release.
From that branch, you have feature branches which are merged back (or not) into the development branch.
This is typical, for instance, of gitflow.
In your case, each "next open release branches" can be a development branch of its own. It does not have to be called "development" or to be unique to provide the same service as a traditional "development" branch.