Hi Alexei,
Thanks for a great question, though my answer might be disappointing to you. The answer is that there is in principle a nice algorithm to do this, but I don't think it's ever been published and I don't know of an existing code that offers it, including ITensor. It's certainly something we could add, in the sense of being a feature that would be a good fit for our library and we'd like to offer, but I can't promise any time frame for when we would add it.
The shortest version I can give of how this algorithm would work starts with some background: your idea of using an MPO projector would indeed run into an issue but it may not be exactly the one you meant. The issue is not that the final MPS would end up with a large bond dimension - that would not happen - but that the actual MPO itself would be very large so that using it would still be prohibitively expensive on a large system.
So the algorithm I would write would go more like this (it's a very rough description): first you would project the first site into various symmetry sectors (for the case of particle number or U(1) symmetry these would be different particle numbers). Then you would keep track of the different projection results by either storing separate tensors corresponding to each type of projection (0 particle tensor, 1 particle tensor, etc.) or by actually starting to construct the MPO you were talking about and having its first tensor.
Next, you would make a projector that combines the information about the previous projection with the projection on the next site, and creates new tensors corresponding to the various outcomes, which would now cover a larger range of possibilities: 0, 1, 2, etc particles. At this point it starts to become important to truncate this set of tensors in some way. This would depend on the details of the algorithm. The simplest version would be to evaluate the probability of seeing the particular total quantum numbers you are keeping track of and discard the ones whose probability falls below some threshold. A more sophisticated way would to be to continue to use this "partial projector MPO" picture to devise a truncation procedure.
Proceeding this way, one would continue to alternate between projecting and truncating, site by site.
The crucial thing is that one has to truncate "on the fly" as the projection is being done to avoid a blowup of costs. Otherwise, the algorithm just won't be efficient in general.
Sorry that my answer is so vague, but it's not an algorithm that's written down anywhere I am aware of. I hope to write more about it or implement it at some point.
Best regards,
Miles
P.S. there may be some other easier things that can be tried. For example, one could create an MPO which enforces an energy penalty that favors a particular total quantum number over others, and include this MPO in a DMRG calculation to 'target' a state with these particular quantum numbers. This can be used as a kind of "poor man's" approach to, say, get a certain SU(2) quantum number in a code, like ITensor, that currently only offers Abelian quantum number conservation. I've done this particular one before and it worked well.