Update: On Wolfram Cloud, the timing comparison I get is the opposite of David's claim that "the result is about twice as fast as the generation of the list and the result in the fastest method described by others here"; that is, to my surprise, BitXor-based method is more than 2x faster than David's method. Using RandomVariate+ EmpiricalDistribution + WeightedData combination instead of RandomChoice improves the timings. Using IdentityMatrix[3] as suggested by @Carl, the timings for David's method improve significantly but they are still no better than the timings for BitXor-based methods.
ClearAll[f1,f2,f3,f4] f1[n_]:= Module[{lst=Developer`ToPackedArray@RandomChoice[{0.5, 0.3, 0.2}->{1, 2, 3}, n]}, BitXor[1, Unitize[BitXor[#, lst] & /@ {1, 2, 3}] ]] f2[n_]:= Module[{lst=Developer`ToPackedArray[ RandomVariate[ EmpiricalDistribution[WeightedData[Range[3], {.5, .3, .2}]], n]]}, BitXor[1, Unitize[BitXor[#, lst] & /@ {1, 2, 3}] ]] f3[n_]:= Transpose[Developer`ToPackedArray@RandomChoice[{.3, .2, .5} -> {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}, n]] f4[n_]:= Transpose[Developer`ToPackedArray@RandomChoice[{.3, .2, .5} -> IdentityMatrix[3], n]] funcs = {f1, f2, f3, f4}; timings = Prepend[Table[Prepend[Table[First[RepeatedTiming[funcs[[j]][i]]], {j, 1, 4}], i], {i, {200000, 10^6}}], {"n", "f1","f2","f3", "f4"}]; Grid[timings, Dividers -> All] // TeXForm
$\begin{array}{|c|c|c|c|c|} \hline \text{n} & \text{f1} & \text{f2} & \text{f3} & \text{f4} \\ \hline 200000 & 0.0069 & 0.0061 & 0.016 & 0.0063 \\ \hline 1000000 & 0.0359 & 0.032 & 0.0885 & 0.035 \\ \hline \end{array}$
(I cannot time larger lists because the required computation exceeds the memory limit of the free cloud accounts.)
Original answer:
{l1, l2, l3} = BitXor[1, Unitize[BitXor[#, list] & /@ {1, 2, 3}] ] TeXForm @ {list, l1, l2, l3}
$\left( \begin{array}{cccccccccccccccccccc} 1 & 1 & 1 & 1 & 1 & 2 & 3 & 1 & 2 & 1 & 1 & 1 & 2 & 3 & 2 & 1 & 1 & 1 & 3 & 2 \\ 1 & 1 & 1 & 1 & 1 & 0 & 0 & 1 & 0 & 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 \\ \end{array} \right)$
Timings: Using Henrik's setup, this is twice as fast as Henrik's method.
list = Developer`ToPackedArray[RandomChoice[{0.5, 0.3, 0.2} -> {1, 2, 3}, 200000]]; RepeatedTiming[{l1, l2, l3} = BitXor[1, Unitize[BitXor[#, list] & /@ {1, 2, 3}] ]][[1]]
0.0013
RepeatedTiming[list1a = Subtract[1, Unitize[Subtract[list, 1]]]; list2a = Subtract[1, Unitize[Subtract[list, 2]]]; list3a = Subtract[1, Unitize[Subtract[list, 3]]];][[1]]
0.0025
RepeatedTiming[list1b = Unitize@Clip[list, {1, 1}, {0, 0}]; list2b = Unitize@Clip[list, {2, 2}, {0, 0}]; list3b = Unitize@Clip[list, {3, 3}, {0, 0}];][[1]]
0.0027
And @@ (Equal @@@ Transpose[{{list1a, list2a, list3a}, {list1b, list2b, list3b}, {l1, l2, l3}}])
True
listas the OP does, but he explicitly asks whether a different method of generation might be faster. I think there is (see below). $\endgroup$