If $T$ denotes your translation by $(2,0)$, and $R$ your rotation by $90^\circ$ around the origin, then your map is $Q=R\circ T$. You can find $Q$ either analytically or geometrically.
Analytic solution
$T$ and $R$ are defined by
$$
T(x)=x+(2,0)=(x_1+2,x_2), \, R(x)=(-x_2,x_1) \quad \forall x \in \mathbb{R}^2.
$$
Therefore
$$
Q(x)=R(T(x))=R(x_1+2,x_2)=(-x_2,x_1+2) \quad \forall x=(x_1,x_2)\in \mathbb{R}^2
$$
Notice that $Q$ has exactly one fixed point, i.e. $a=(-1,1)$. In fact $Q(x)=x \iff x=(-1,1)$ and therefore $Q$ is a rotation.
For every $x\in \mathbb{R}^2$ we have
$$
(x-a)\cdot(Q(x)-a)=(x_1+1,x_2-1)\cdot(-x_2+1,x_1+1)=0,
$$
i.e. $(x-a)\perp (Q(x)-a)$, and therefore $Q$ is a rotation by $90^\circ$ around the point $a=(-1,1)$.
Geometric solution
If $\Delta\subset \mathbb{R}^2$ is a straight line, we denote by $S_\Delta$ the reflection about $\Delta$. We can then write
$$
T=S_{L_0}\circ S_{L_1}, \quad R=S_{L_2}\circ S_{L_0},
$$
with
\begin{eqnarray}
L_0&=&\{(x_1,x_2)\in \mathbb{R}^2:\, x_1=0 \},\\
L_1&=&\{(x_1,x_2)\in \mathbb{R}^2:\, x_1=1 \},\\
L_2&=&\{(x_1,x_2)\in \mathbb{R}^2:\, x_2=-x_1 \}
\end{eqnarray}
We have
$$
Q=R\circ T=(S_{L_2}\circ S_{L_0})\circ(S_{L_0}\circ S_{L_1})=S_{L_2}\circ (\underbrace{S_{L_0}\circ S_{L_0}}_{\mbox{identity}})\circ S_{L_1}=S_{L_2}\circ S_{L_1}
$$
Since the two lines $L_1$ and $L_2$ intersect at the point $a=(1,-1)$ and the angle $(L_1,L_2)$ between $L_1$ and $L_2$ is $45^\circ$, it follows that $Q$ is a rotation by $2\times45^\circ=90^\circ$ around the point $a=(-1,1)$.
If you know the branch vector $\vec b = (x_0, y_0, z_0)$, then any vector perpendicular to it , say $\vec p = (x_1, y_1, z_1)$ will have dot product $0$.
So,
$$
\vec b . \vec p = x_0x_1 + y_0y_1 + z_0z_1 = \vec0 \\\text{dot product is zero as they are perpendicular}
$$pick any $x_1, y_1$ you prefer, and set $z_1$ as
$$z_1 = - \frac{\left (x_0 x_1 + y_0 y_1\right)}{ z_0}$$
That seems to be the simplest approach to get "random" branches.
If you want to control the length of the vector, then you can always normalize your obtained vector $\vec p$ and get the result vector $\vec r$ by using
$$
\vec r = len \times\frac{\vec p}{\left | \vec p\right| }
$$
where $len$ is the desired length of the vector.
If $z_0$ is $0$, then you'll get a singularity when you try to divide by $z_0$.
However, since $z_0$ is $0$, it does not impact the dot product at all, and therefore we can pick any $z_1$ we want to.
Solve for $y_1$ by picking some $x_1$, and then allowing $z_1$ to be "free" (that is, you can pick any $z_1 \in \mathbb{R}$). However, in doing so, you'll face a problem if $y_0$ is $0$ as well.
If both $z_0 = y_0 = 0$, then, you're forced to set $x_1 = 0$ (to maintain the dot product as $0$ for perpendicularity) while having $y_1, z_1 \in \mathbb{R}$ (that is, they are free).
Best Answer
If I'm understanding correctly, you want find the angle needed to rotate the plane containing both $v$ and $p_1$ until that plane contains $p_2$.
If $p_1\times p_2 = \lambda v$, the angle is simply $\theta(p_1,p_2) = \dfrac{p_1\cdot p_2}{|p_1||p_2|}$.
To make this work for the case where $p_1\times p_2 \neq \lambda v$, we can instead use $\theta(p_1,\hat p_2)$, where $\hat p_2$ is the projection of $p_2$ into the plane containing $p_1$ with normal $v$. Doing this gives us
$$\hat p_2 = p_2 - (v\cdot(p_2-p_1))v$$
(See this question if you're confused about this step)
Note that the rotated point $p_1'$ is a scaled $\hat p_2$, in particular
$$ p_1' = \frac{|p_1|}{|\hat p_2|}\hat p_2 $$