It is a one-line proof, but you are meant to be familiar with the language, or some equivalent thereof. Let's call F the fundamental representation N×N matrices, A the adjoint (N²—1)×(N²—1) ones, and 0 the 1-dim singlet rep ones.
The Kronecker product fundamental-antifundamental (N×N)⊗(N×N) representation matrices are given by the coproduct,
$$
F^a\otimes 1\!\!1 + 1\!\!1 \otimes \bar F^a = A^a \oplus 0 = A^a,
$$
which you must check satisfies the same Lie algebra!
Now multiply this with its a ⟶ b analog,
$$
(F^a\otimes 1\!\!1 + 1\!\!1 \otimes \bar F^a) (F^b\otimes 1\!\!1 + 1\!\!1 \otimes \bar F^b) = A^a A^b= \\
F^a F^b\otimes 1\!\!1 + 1\!\!1 \otimes \bar F^a \bar F^b + F^a\otimes \bar F^b + F^b\otimes \bar F^a,
$$
and trace. The trace of the direct product amounts to a plain product of the separate traces of each tensor factor, of course, so the last two terms vanish, as the F s are traceless.
You thus establish in a blink that
$$
2N\operatorname{tr} F^a F^b = \operatorname{tr} A^a A^b .
$$
If the trace on the right is N, the trace on the left must be 1/2.
You know the trace of all irreps must be fixed w.r.t. the adjoint normalization, as scaling up the generators of the algebra results in an identical rescaling of the structure constants, which we already fixed.
The reason for these choices, despised by mathematicians (who normalize the linchpin f s with 1), is because we want all SU(N) s to include an isospin SU(2) with its conventional spin 1/2 normalizations... The mayhem started with flavor SU(3) and lives on...
To make sure you are in control of the algorithm, try composing ${\bf 3}\otimes {\bf 3}= {\bf 6}\oplus \bar{\bf 3}$ in SU(3) and compute this trace for the sextet. You should find $3 - 1/2$=5/2. It is half the representation index you find in math texts.