Here are two different ways. I like the second best.
Iterated expectations:
For events $A$ and random variables $X$ we can define:
$$ P[A|X] = E[1_A|X]$$
where $1_A$ is an indicator function that is 1 if event $A$ holds, and 0 else.
Then iterated expectations gives
$$ P[A] = E[E[1_A|X]] $$
For the event $A = \{(X,Y) \in B\}$ we get
\begin{align}
P[(X,Y)\in B] &= E[E[1_{\{(X,Y) \in B\}}|X]] \\
&= \int_{-\infty}^{\infty} f_X(x) P[(X,Y)\in B|X=x] dx \\
&= \int_{-\infty}^{\infty} f_X(x) P[(x,Y)\in B|X=x] dx \\
\end{align}
where the last line is using the idea in the Graham Kemp answer.
Another way:
For events $A$ and random variables $X$ with $f_X(x)>0$ we can define:
$$P[A|X=x] = \frac{f_{X|A}(x)P[A]}{f_X(x)}$$
and you can verify that
$$ P[A] = \int_{-\infty}^{\infty} P[A|X=x] f_X(x)dx$$
For the event $A = \{(X,Y) \in B\}$ we get
\begin{align}
P[(X,Y) \in B] &= \int_{-\infty}^{\infty} P[(X,Y) \in B| X=x] f_X(x)dx\\
&=\int_{-\infty}^{\infty} P[(x,Y) \in B| X=x] f_X(x)dx\\
\end{align}
where again the last line is using the idea in the Graham Kemp answer.