[proofplan]
The proof uses only the weight decompositions of $V$ and $W$ and the standard [tensor product](/page/Tensor%20Product) action. First we check that a tensor of a $\lambda$-weight vector with a $\mu$-weight vector has weight $\lambda+\mu$. Then we use distributivity of tensor product over finite direct sums to decompose $V\otimes_{\mathbb C}W$, and we group the summands by their total weight. Finally, taking dimensions of the resulting weight spaces gives exactly the coefficient identity encoded by multiplication of formal characters.
[/proofplan]
[step:Decompose the two modules into their weight spaces]
Let $\operatorname{Wt}(V)\subset\mathfrak h^*$ denote the finite set of weights $\lambda$ such that $V_\lambda\neq 0$, and let $\operatorname{Wt}(W)\subset\mathfrak h^*$ denote the finite set of weights $\mu$ such that $W_\mu\neq 0$. Since $V$ and $W$ are finite-dimensional weight modules with respect to $\mathfrak h$, their weight decompositions are finite direct sums:
\begin{align*}
V=\bigoplus_{\lambda\in\operatorname{Wt}(V)}V_\lambda.
\end{align*}
\begin{align*}
W=\bigoplus_{\mu\in\operatorname{Wt}(W)}W_\mu.
\end{align*}
For each $\nu\in\mathfrak h^*$, define the candidate $\nu$-weight summand $S_\nu\subseteq V\otimes_{\mathbb C}W$ by
\begin{align*}
S_\nu:=\bigoplus_{\substack{\lambda\in\operatorname{Wt}(V), \ \mu\in\operatorname{Wt}(W), \lambda+\mu=\nu}}V_\lambda\otimes_{\mathbb C}W_\mu.
\end{align*}
If no pair $(\lambda,\mu)$ satisfies $\lambda+\mu=\nu$, this [direct sum](/page/Direct%20Sum) is the zero subspace.
[/step]
[step:Check that each tensor product summand has the expected weight]
Fix $\lambda\in\operatorname{Wt}(V)$ and $\mu\in\operatorname{Wt}(W)$. Let $v\in V_\lambda$, let $w\in W_\mu$, and let $h\in\mathfrak h$. The tensor product action gives
\begin{align*}
h\cdot(v\otimes w)=(h\cdot v)\otimes w+v\otimes(h\cdot w).
\end{align*}
Since $v\in V_\lambda$ and $w\in W_\mu$, this becomes
\begin{align*}
h\cdot(v\otimes w)=\lambda(h)v\otimes w+\mu(h)v\otimes w.
\end{align*}
Therefore
\begin{align*}
h\cdot(v\otimes w)=(\lambda+\mu)(h)(v\otimes w).
\end{align*}
Because this holds for every $h\in\mathfrak h$, every pure tensor in $V_\lambda\otimes_{\mathbb C}W_\mu$ has weight $\lambda+\mu$, and by linearity
\begin{align*}
V_\lambda\otimes_{\mathbb C}W_\mu\subseteq (V\otimes_{\mathbb C}W)_{\lambda+\mu}.
\end{align*}
[guided]
The point of the tensor product action is that an element $h\in\mathfrak h$ acts on both factors at once. Fix weights $\lambda\in\operatorname{Wt}(V)$ and $\mu\in\operatorname{Wt}(W)$, choose $v\in V_\lambda$ and $w\in W_\mu$, and let $h\in\mathfrak h$. By definition of the tensor product $\mathfrak g$-action,
\begin{align*}
h\cdot(v\otimes w)=(h\cdot v)\otimes w+v\otimes(h\cdot w).
\end{align*}
Now we use exactly what it means for $v$ and $w$ to be weight vectors. Since $v\in V_\lambda$, one has $h\cdot v=\lambda(h)v$. Since $w\in W_\mu$, one has $h\cdot w=\mu(h)w$. Substituting these two identities into the tensor product action gives
\begin{align*}
h\cdot(v\otimes w)=\lambda(h)v\otimes w+\mu(h)v\otimes w.
\end{align*}
The two terms are scalar multiples of the same tensor $v\otimes w$, so they combine as
\begin{align*}
h\cdot(v\otimes w)=(\lambda(h)+\mu(h))(v\otimes w).
\end{align*}
Since addition in $\mathfrak h^*$ is pointwise, $\lambda(h)+\mu(h)=(\lambda+\mu)(h)$. Hence
\begin{align*}
h\cdot(v\otimes w)=(\lambda+\mu)(h)(v\otimes w).
\end{align*}
This calculation was for an arbitrary $h\in\mathfrak h$, so $v\otimes w$ is a weight vector of weight $\lambda+\mu$. A general element of $V_\lambda\otimes_{\mathbb C}W_\mu$ is a finite $\mathbb C$-linear combination of such pure tensors, and the same eigenvalue equation is preserved under linear combinations. Therefore
\begin{align*}
V_\lambda\otimes_{\mathbb C}W_\mu\subseteq (V\otimes_{\mathbb C}W)_{\lambda+\mu}.
\end{align*}
[/guided]
[/step]
[step:Write the whole tensor product as a direct sum indexed by total weights]
Distributivity of the tensor product over finite direct sums gives a vector-space direct sum decomposition
\begin{align*}
V\otimes_{\mathbb C}W=\bigoplus_{\lambda\in\operatorname{Wt}(V)}\bigoplus_{\mu\in\operatorname{Wt}(W)}V_\lambda\otimes_{\mathbb C}W_\mu.
\end{align*}
Grouping the finitely many summands according to the total weight $\nu=\lambda+\mu$ yields
\begin{align*}
V\otimes_{\mathbb C}W=\bigoplus_{\nu\in\mathfrak h^*}S_\nu.
\end{align*}
Only finitely many $S_\nu$ are nonzero, namely those with $\nu=\lambda+\mu$ for some $\lambda\in\operatorname{Wt}(V)$ and $\mu\in\operatorname{Wt}(W)$.
[/step]
[step:Identify each grouped summand with the corresponding weight space]
The previous weight calculation gives
\begin{align*}
S_\nu\subseteq (V\otimes_{\mathbb C}W)_\nu
\end{align*}
for every $\nu\in\mathfrak h^*$. Conversely, let $u\in (V\otimes_{\mathbb C}W)_\nu$. Using the direct sum decomposition by the subspaces $S_\eta$, write uniquely
\begin{align*}
u=\sum_{\eta}u_\eta
\end{align*}
where $u_\eta\in S_\eta$ and only finitely many $u_\eta$ are nonzero.
For every $h\in\mathfrak h$, since $u\in (V\otimes_{\mathbb C}W)_\nu$ and each $u_\eta\in S_\eta\subseteq (V\otimes_{\mathbb C}W)_\eta$, we have
\begin{align*}
\nu(h)u=h\cdot u=\sum_{\eta}\eta(h)u_\eta.
\end{align*}
Also
\begin{align*}
\nu(h)u=\sum_{\eta}\nu(h)u_\eta.
\end{align*}
Subtracting gives
\begin{align*}
\sum_{\eta}(\eta(h)-\nu(h))u_\eta=0.
\end{align*}
Because the sum over the $S_\eta$ is direct, for each $\eta$ and each $h\in\mathfrak h$,
\begin{align*}
(\eta(h)-\nu(h))u_\eta=0.
\end{align*}
If $\eta\neq\nu$, then there exists $h_\eta\in\mathfrak h$ such that $\eta(h_\eta)\neq\nu(h_\eta)$, because distinct linear functionals on $\mathfrak h$ differ at some vector. Taking $h=h_\eta$ gives $u_\eta=0$. Hence all components except possibly $u_\nu$ vanish, so $u=u_\nu\in S_\nu$. Therefore
\begin{align*}
(V\otimes_{\mathbb C}W)_\nu=S_\nu=\bigoplus_{\lambda+\mu=\nu}V_\lambda\otimes_{\mathbb C}W_\mu.
\end{align*}
This also proves that $V\otimes_{\mathbb C}W$ is a weight module.
[/step]
[step:Take dimensions to obtain the character identity]
For each $\nu\in\mathfrak h^*$, the weight-space formula gives
\begin{align*}
\dim_{\mathbb C}(V\otimes_{\mathbb C}W)_\nu
=
\sum_{\lambda+\mu=\nu}\dim_{\mathbb C}(V_\lambda\otimes_{\mathbb C}W_\mu).
\end{align*}
Since $V_\lambda$ and $W_\mu$ are finite-dimensional complex vector spaces,
\begin{align*}
\dim_{\mathbb C}(V_\lambda\otimes_{\mathbb C}W_\mu)
=
\dim_{\mathbb C}(V_\lambda)\dim_{\mathbb C}(W_\mu).
\end{align*}
Thus
\begin{align*}
\dim_{\mathbb C}(V\otimes_{\mathbb C}W)_\nu
=
\sum_{\lambda+\mu=\nu}\dim_{\mathbb C}(V_\lambda)\dim_{\mathbb C}(W_\mu).
\end{align*}
Using the formal multiplication rule $e^\lambda e^\mu=e^{\lambda+\mu}$, we compute
\begin{align*}
\operatorname{ch}V\,\operatorname{ch}W
=
\sum_{\lambda,\mu}\dim_{\mathbb C}(V_\lambda)\dim_{\mathbb C}(W_\mu)e^{\lambda+\mu}.
\end{align*}
Grouping this finite sum by $\nu=\lambda+\mu$ gives
\begin{align*}
\operatorname{ch}V\,\operatorname{ch}W
=
\sum_{\nu}\dim_{\mathbb C}(V\otimes_{\mathbb C}W)_\nu e^\nu.
\end{align*}
By the definition of the formal character, the right-hand side is $\operatorname{ch}(V\otimes_{\mathbb C}W)$. Therefore
\begin{align*}
\operatorname{ch}(V\otimes_{\mathbb C}W)=\operatorname{ch}V\,\operatorname{ch}W.
\end{align*}
[/step]