There is no discrepancy in the two methods. The first method shows that $L := \overline{\overline{L_1} \cup \overline{L_2}}$ is context-sensitive. The second method shows the stronger result that $L$ is context-free. Both of these are consistent. Compare the following: $$ 1 + 1 \leq 1 + 2 = 3 \Longrightarrow 1 \leq 3 \\ 1 + 1 \leq 2 $$ The first inequality shows that $x := 1 + 1$ satisfies $x \leq 3$. The second inequality is stronger, showing that $x \leq 2$. There is no discrepancy here. The second inequality is simply better.
The term context-sensitive is somewhat of a misnomer. Being context-sensitive doesn't preclude being context-free. In particular, every context-free language is also context-sensitive.
Here is how to cut the slack in your first argument:
- Since $L_1$ is regular, $L_1^c$ is regular.
- Since $L_2$ is context-free, $L_2^c$ is co-context-free (a language is co-context-free if its complement is context-free).
- Since $L_1^c$ is regular and $L_2^c$ is co-context-free, so is $L_1^c \cup L_2^c$.
- Hence $(L_1^c \cup L_2^c)^c$ is context-free.
In this case we were lucky to find classes of languages which tightly describe all intermediate steps. Sometimes we are not as lucky, and we need to find a different of proving that a certain language, constructed in a certain way, belongs to a certain language class.