Is there a way to filter blocks by vocabulary instead of NID or CT?
Have a look at my answer to "How to make &quot;Page specific visibility settings&quot; for blocks more flexible?". It explains how the Rules block visibility module can be used to answer that question.

Your question here seems to be a variation of it. You could use a similar approach, so that in the end you'd only have to write a Rules Component related to your criteria here, ie to intercept your condition about "if at least one term of a given vocabulary is in the node" (in which case the Rules block visibility module should take care of "showing the block in whatever region". Done!

Note: for this to work, do not have to enable the PHP Filter module (always a good thing if you can  avoid that).