This isn't quite an answer to your question so much as an elaboration of my comments.

Each Dynkin diagram, or equivalently Cartan matrix $a_{ij}$, determines a presentation of the corresponding complex Lie algebra $\mathfrak{g}$ (which is much the same data as the compact Lie group). I have the name ``Chevalley'' associated to this presentation, but perhaps Cartan and Serre are also important. In any case, the presentation is the following. For each node $i$ of the Dynkin diagram, you introduce three generators $h_i,x^+_i,x^-_i$. You declare that the $h_i$s commute among themselves, that $[h_i, x^{\pm}_j] = \pm a_{ij}x^\pm_j$, and that $[x_i^+,x_j^-] = \delta_{ij}h_i$, so that for fixed $i$, $\{h_i,x_i^+,x_i^-\}$ forms an $\mathfrak{sl}(2)$-triple. So far this presents an infinite-dimensional Lie algebra with a unique finite-dimensional quotient. To cut down to the quotient, you need also to impose the *Serre relations* which say that, for $\epsilon \in \{+,-\}$, $(\operatorname{ad} x^\epsilon_i)^{1-a_{ij}} x^\epsilon_j = 0$, where of course $(\operatorname{ad} x)(y) = [x,y]$. This presentation of $\mathfrak{g}$ is detailed in various textbooks, for instance Section 5.6 of my lecture notes.

This presentation has various advantages and disadvantages. It makes manifest the sub Lie groups corresponding to sub diagrams, and obscures most other subgroups. In particular, it makes manifest an action on $\mathfrak{g}$ by the diagram automorphisms — it is a standard, although nontrivial, result that the group of diagram automorphisms is isomorphic via this action to the outer automorphism group $\operatorname{Out}(\mathfrak{g}) = \operatorname{Aut}(\mathfrak{g})/\operatorname{Inn}(\mathfrak{g})$ of $\mathfrak{g}$ — and obscures other possible splittings of the map $\operatorname{Aut}(\mathfrak{g}) \to \operatorname{Out}(\mathfrak{g})$.

In particular, taking the $D_4$ diagram and its subdiagram of the three outer nodes, we find a manifest triality-fixed (in the setwise sense) subgroup $\mathrm{Sp}(1)^3 \subset \mathrm{Spin}(8)$. Well, at the Lie algebra level it is $\mathfrak{sl}(2)^3 = \mathfrak{sp}(1)^3 \subset \mathfrak{spin}(8) = \mathfrak{so}(8)$; at the Lie group level one should take some central quotient. Clearly triality acts to permute the three $\mathrm{Sp}(1)$s, and so its fixed locus is a single copy of $\mathrm{Sp}(1)$. Note that the $\mathfrak{sl}(2)$-triple corresponding to the central node in the $D_4$ diagram is also fixed (pointwise!) by triality. Together, this fixed $\mathfrak{sl}(2)$ and the diagonal $\mathfrak{sl}(2) \subset \mathfrak{sl}(2)^3$ generate the full fixed subgroup $G_2$ — indeed, they correspond to the two nodes in the $G_2$ dynkin diagram. (The "diagonal" $\mathfrak{sl}(2)\subset \mathfrak{sl}(2)^3$ is "three times longer" than any coordinate, explaining why $G_2$ has roots of different lengths.)

Actually, there is a copy of $\mathfrak{sl}(2) \subset \mathfrak{g}$ associated to each root, not just the simple ones. (This is a slightly subtle point. Given a root $\alpha$, you can take $x^\pm$ to be generators of the $\pm\alpha$ root spaces, and $h = [x^+,x^-]$. But the normalization of $x^\pm$ is ambiguous, so the root $\alpha$ *does not* uniquely determine a homomorphism $\mathfrak{sl}(2) \to \mathfrak{g}$, but rather determines a subalgebra of $\mathfrak{g}$ abstractly-isomorphic to $\mathfrak{sl}(2)$. Actually, using the theory of vertex algebras, you can *almost* specify the normalization of $x^\pm$, but there is a fundamental sign ambiguity. This sign ambiguity is reflected by the fact that the the Weyl group *is not* typically a subgroup of the Lie group, but that there is a typically-nonsplit extension of shape $2^{\text{rank}}.\text{Weyl}$, called the "Tits lift of the Weyl group", which is a subgroup of the Lie group.)

In particular, you can take the three outer nodes of the $D_4$ Dynkin diagram together with the highest root, and these will together produce a subgroup $\mathrm{Sp}(1)^4 \subset \mathrm{Spin}(8)$ (I continue to ignore central quotients), which turns out to be maximal and to be a centralizer in $\mathrm{Spin}(8)$.

You actually know this $\mathrm{Sp}(1)^4$. Identify $\mathrm{Spin}(4) = \mathrm{Sp}(1)^2$; but of course $\mathrm{Spin}(4)^2 \subset \mathrm{Spin}(8)$, up to central factors. This lets you see exactly how the vector and spin representations of $\mathrm{Spin}(8)$ decompose. Indeed, the vector $V^8$ decomposes over $\mathrm{Spin}(4)^2$ as $V^4 \otimes 1 \oplus 1 \otimes V^4$, where $1$ denotes the trivial module, and the isomorphism $\mathrm{Spin}(4) = \mathrm{Sp}(1)^2$ identifies $V^4$ with the tensor product of the two 2-dimensional modules, so all together
$$ V^8|_{\mathrm{Sp}(1)^4} = 2 \otimes 2 \otimes 1 \otimes 1 + 1 \otimes 1 \otimes 2 \otimes 2.$$
On the other hand, the *full* spin module for $\mathrm{Spin}(m+n)$ decomposes over $\mathrm{Spin}(m)\times \mathrm{Spin}(n)$ as the product of the two full spin modules. In even dimensions, the full spin module breaks as a sum of half-spin modules. The result is that the half-spin module $S^8_+$ decomposes over $\mathrm{Spin}(4)^2$ as $S^4_+ \otimes S^4_+ \oplus S^4_- \otimes S^4_-$, where $S^4_\pm$ are the two 2-dimensional half-spin modules for $\mathrm{Spin}(4)$, whereas $S^8_-$ decomposes as $S^4_+ \otimes S^4_- \oplus S^4_+ \otimes S^4_-$. Under the identification $\mathrm{Spin}(4) = \mathrm{Sp}(1)^2$, the half-spin modules are identified with $2\otimes 1$ and $1\otimes 2$, respectively, and so
$$ S^8_+ |_{\mathrm{Sp}(1)^4} = 2 \otimes 1 \otimes 2 \otimes 1 + 1 \otimes 2 \otimes 1 \otimes 2,$$
$$ S^8_- |_{\mathrm{Sp}(1)^4} = 2 \otimes 1 \otimes 1 \otimes 2 + 1 \otimes 2 \otimes 2 \otimes 1.$$
Triality permutes the modules $V^8 \mapsto S^8_+ \mapsto S^8_-$, and so permutes the three ways of pairing off these four $\mathrm{Sp}(1)$s.

The four $\mathrm{Sp}(1)$s in $\mathrm{Sp}(1)^4 \subset \mathrm{Spin}(8)$ all look the same from this perspective. What we did when we fixed the presentation (aka Dynkin diagram) was to choose one of them to correspond to the highest root, and the other three to be the outer nodes of the dynkin diagram. The specific triality automorphism depended on this choice. (Different choices are related by inner automorphisms. In this case, if you chose a different $\mathrm{Sp}(1)$ from $\mathrm{Sp}(1)^4$ as your highest root, your choice would be related to mine by an element of the Weyl group. This is because implicitly we chose the Cartan of $\mathrm{Spin}(8)$ to be the Cartan of $\mathrm{Sp}(1)^4$.) I mention this to emphasize the subtleties when talking about "fixed points of triality".

Maybe I'll end with one more comment, which is that I mentioned $G_2$ contains an $\mathrm{Sp}(1)^2$ (up to central blah blah). We can recognize is at spanned by the (fixed) "highest" $\mathrm{Sp}(1)$, which might as well be the first of the $\mathrm{Sp}(1)^4$, and a diagonal copy inside the other three. Then over this, how do the above 8-dimensional modules break? The answer is clear: $2\otimes 1\otimes 1$ restricts over the diagonal to $2$, whereas $1 \otimes 2 \otimes 2$ restricts as $3+1$. So we get
$$ 8 = 2 \otimes 2 + 1 \otimes 3 + 1\otimes 1.$$
The first two of these are together the 7-dimensional representation of $G_2$, and the third is the trivial rep.

2more comments