in reply to qr/string/ is not the same as qr/$var/ ?

I have no solution to the eval problem, but FWIW, MO=Deparse,-p clarifies the issue:

% perl -MO=Deparse,-p -le '$patt = "a\Ubc"; print qr/$patt/' BEGIN { $/ = "\n"; $\ = "\n"; } ($patt = 'aBC'); print(qr/$patt/); -e syntax OK
Likewise for \Q...\E:
% perl -MO=Deparse,-p -le '$patt = "a\Q[bc]\E"; print qr/$patt/' BEGIN { $/ = "\n"; $\ = "\n"; } ($patt = 'a\\[bc\\]'); print(qr/$patt/); -e syntax OK
In other words, by the time that qr sees it, perl has already transformed the original string, which explains both the problem and the eval workaround.

Note that this behavior occurs only if the RHS of the first assignment is double-quoted; with single-quotes you end up with the same problem as if the pattern had been passed in in @ARGV:

% perl -le '$patt = q(a\Ubc); print qr/$patt/' (?-xism:a\Ubc)

Update: Deleted a bit of stray text that had snuck into one of the original code snippets; added the output for the \Q...\E case.

the lowliest monk