As I mentioned in the comments, you have not used the uniform convergence of $f_n$ or $g_n$ in your argument. And in fact, it is not necessary for your statement to hold. The important difference between pointwise and uniform convergence is that the later is global in the sense that the $N$ you find depends only on $\epsilon$ and not on $x$. Geometrically, suppose that $f_n \to f$ uniformly. Then, consider the graph of $f$ engulfed by $f+\epsilon$ and $f-\epsilon$. Picture this like a cylinder of radius $\epsilon$ wrapped around $f$ at each point of its domain entirely.
When the convergence is uniform, after a certain $N$, all $f_n$'s will be contained in this tubular (cylindrical) neighborhood globally for $n \geq N$. When the convergence is not uniform, no matter what $N$ is, some $f_n$'s will not be completely contained in this tubular (cylindrical) neighborhood. This is the geometric idea. In other words, the cylinder wrapped around $f$ might get wider or narrower around some points to contain $f_n$'s. It won't look uniform to us anymore.
In your case, your theorem is implied by the following simple theorem about real sequences:
$$\lim_{n\to\infty} a_n \times \lim_{n\to\infty} b_n = \lim_{n\to\infty} a_n\times b_n$$
where $a_n$ and $b_n$ are real sequences. Note that for any $x$, $f_n(x)$ and $g_n(x)$ are real sequences. Now try to continue your reasoning from here.
Use @Michael's idea: first, to fix your observation about the uniform continuous of $(f_n)$ on $[0,1]$, you have to break your line
$|f_n(x)-f_n(y)| \leqslant 2016|x-y|=\epsilon/3$
into two separate statements:
- $(f_n)$ is $2016$-Lipschitz.
- $\forall \epsilon > 0, \exists \delta > 0: \forall x,y \in [0,1], |x-y| < \delta \implies |f_n(x)-f_n(y)| < \epsilon / 3$.
But #2 is still ambiguous since there's no quantifier and domain for the variable $n$ stated, and it's not clear if $\delta$ depends on $n$. To make things clear, you may fix $\epsilon > 0$ and define $\delta = \epsilon / 6048$, so that whenever $|x-y| < \delta$, #1 can be applied to get #2.
Then we proceed to the partition $P = \{x_0 = 0,x_1 = \delta, x_2 = 2\delta, \dots, x_{M-1} = (M-1) \delta, x_M = 1\}$, where $M = \lceil 1/\delta \rceil$ is the number of subintervals of $P$. Use pointwise convergence on each partition point $x_i$ to yield $N_i \in \mathbb{N}$ such that for all $n \ge N_i$, $|f_n(x_i)| < \epsilon / 3$.
Observation 2: for each partition point $x_i$, $f_n(x_i)$ is $\epsilon$-small when $n$ is sufficiently large.
Now go back to the paragraph about the uniform continuity of $(f_n)$. Apply this on a partition point $x_i$ and a (non-partition) point $x \in [x_i,x_{i+1})$, then $|x_i - x| < \delta$, so $|f_n(x_i) - f_n(x)| < \epsilon / 3$.
Observation 1: when $x$ is $\delta$-close to a partition point $x_i$, $f_n(x_i)$ approximates $f_n(x)$ $\epsilon$-closely, and the error $\epsilon/3$ is independent of $n$.
The question asks for the uniform convergence of $(f_n)$ on $[0,1]$, so we need $N = \max\limits_{i \in \{0, 1, \dots, M\}} N_i$, so that whenever $n \ge N (\ge N_i)$ and $x \in [0,1]$, $$|f_n(x)| \le |f_n(x) - f_n(x_i)| + |f_n(x_i)| \le \epsilon /3 + \epsilon + 3 < \epsilon.$$
To recap:
- bounded derivatives gives subinterval length $\delta$ and $(f_n)$ Lipschitz.
- use $\delta$ to build partition $P = \{x_i\}_i$.
- apply pointwise convergence on partition points $x_i$. use $N = \max_i N_i$ to complete the logic.
- use triangle inequality to conclude.
$\require{AMScd}$
\begin{CD}
f_n(x_i) @<\delta \to 0< \text{uniform convergence} < f_n(x)\\
@V n \to \infty V \text{pointwise limit} V @.\\
0
\end{CD}
Best Answer
Instead of inserting $\pm f_n\circ g(x)$ in the middle, insert $\pm f\circ g_n(x):$
Since $f_n\xrightarrow{u.c} f$ there exists $n_0 \in \mathbb{N}$ such that
if $n\geq n_0$ then $|f_n(x)-f(x)|<\epsilon/2\ \forall x\in [0,1]$
and therefore, $$\begin{align} |f_n\circ g_n(x) -f\circ g(x)|&=|f_n\circ g_n(x)-f\circ g_n(x)+ f\circ g_n(x)-f\circ g(x)| \\ &\leq |f_n\circ g_n(x)-f\circ g_n(x)|+|f\circ g_n(x)-f\circ g(x)| \\ &\le\epsilon/2+|f\circ g_n(x)-f\circ g(x)|. \end{align}$$
Now, $f$ is continuous (as a uniform limit of continuous functions), hence uniformly continuous (since $[0,1]$ is compact), so you may choose $\eta>0$ such that $$\forall u,v\in[0,1]\quad(|u-v|\le\eta\implies|f(u)-f(v)|\le\epsilon/2),$$ and then, using that $g_n\xrightarrow{u.c} g,$ choose $n_1\ge n_0$ such that
if $n\geq n_1$ then $|g_n(x)-g(x)|<\eta,\ \forall x\in [0,1]$.
For every $n\ge n_1$ and every $x\in[0,1],$ you thus get $$|f\circ g_n(x)-f\circ g(x)|<\epsilon/2$$ and you are done.
Note that the continuity of the $g_n$'s was not used.