After a couple days of thought, I understand how $Ham(8,4)$ knows $Spin(7)$. I will describe a way here. Since I am answering my own question, I have marked this answer Community Wiki. You are explicitly invited to edit the answer however you see fit to improve it. If you make substantive edits, of course you should probably change this paragraph as well. --Theo
The real Clifford algebra $Cliff(8)$ is naturally a "twisted group algebra" for $\mathbb F_2^8$ in the following sense: it has an $\mathbb R$-basis $x_\alpha$ indexed by $\alpha \in \mathbb F_2^8$ with $x_\alpha x_\beta = \epsilon(\alpha,\beta) x_{\alpha + \beta}$ where $\epsilon = \pm 1$ is some group cocycle on $\mathbb F_2^8$. Of course, different people might make different choices for the cocycle $\epsilon$ --- changing it by a coboundary corresponds to changing the basis by a diagonal matrix. I will fix the following choice: identify $\mathbb F_2^8$ with the power set of $\{1,\dots,8\}$; let $x_1,\dots,x_8$ be the generators of $Cliff(8)$; if $\{i,j,\dots,k\} \subseteq \{1,\dots,8\}$ is ordered (so $i<j<\dots<k$) then $x_{ij\dots k} = x_ix_j\dots x_k$. (I will not use expressions like "$x_{21}$" or "$x_{11}$".)
The Hamming Code $Ham(8,4) \subseteq \mathbb F_2^8$ is a subgroup isomorphic to $\mathbb F_2^4$. Let's try to lift this to an inclusion $\mathbb F_2^4 \to Cliff(8)$.
Recall the definition of the Hamming Code: $\emptyset$ and $12345678 \in Ham(8,4)$, and the rest consists of certain 4-element subsets of $\{1,\dots,8\}$; to figure out which ones, run through all 4-element subsets in alphabetical order, and keep all the ones that have at most two elements of overlap with all previously-kept terms. The end result implies that if $\alpha,\beta \in Ham(8,4)$ and $|\alpha| = |\beta| = 4$, then $|\alpha \cap \beta| = 0$ or $2$. This implies in turn that if $\alpha,\beta \in Ham(8,4)$ then $x_\alpha^2 = x_\beta^2 = 1$ and $x_\alpha x_\beta = x_\beta x_\alpha$.
There's still the sign problem that in general $x_\alpha x_\beta \neq x_{\alpha + \beta}$. To fix this, for $\alpha \in Ham(8,4)$, set $y_\alpha = (-1)^{|\alpha|/4}x_\alpha$. Then
$$ y : \mathbb F_2^4 \cong Ham(8,4) \hookrightarrow Cliff(8) $$
is a multiplicative map. So a lift exists.
Claim: $Spin(7) \subseteq SO(8)$ is precisely the stabilizer of $\sum_{\alpha \in Ham(8,4)} y_\alpha$ (under the conjugation $SO(8)$-action on $Cliff(8)$).
Since the $SO(8)$ action is inner, the image of $\mathfrak{so}(7)$ under this action is precisely the quadratic part of the centralizer of $\sum_{\alpha \in Ham(8,4)} y_\alpha$.
Proof: In the notation of this MO question, $\sum_{\alpha \in Ham(8,4)} y_\alpha = 1 + x_{12345678} - \Omega_0$. But $1$ and $x_{12345678}$ are stabilized by all of $SO(8)$.
How many choices were there? For any choice of four generators of $Ham(8,4)$ (say $1234, 1256, 1278, 1357$) you could set $y'_\alpha = \pm y_\alpha$, but that's it, so there are $2^4$ choices, generated by $4$ of them. (It must go to the line spanned by $x_\alpha$ and have the same square.) You can absorb these choices by changing $x_i$ to $-x_i$ for various $i$s. There are naturally two families of choices distinguished by whether element $12345678 \in Ham(8,4)$ is mapped to $x_{12345678}$ or $-x_{12345678}$. Any two choices in the same family are related by conjugating by diagonal matrices in $SO(8)$. (The two families are related by conjugating by diagonal matrices in $O(8)$ but not in $SO(8)$.)
So there's really not much choice, and the Hamming Code does "know" $Spin(7)$. I think what's going on with the two choices is the following. Let $\tau : Spin(8) \overset \sim \to Spin(8)$ denote the triality map, and let $\iota : Spin(7) \to Spin(8)$ denote the usual embedding (covering the canonical inclusion $\mathfrak {so}(7) \to \mathfrak {so}(8)$ which is $0$ in the last row and column) and $\pi : Spin(8) \to SO(8)$ the double cover. Then the composition $\pi \tau \iota : Spin(7) \to SO(8)$ is the embedding in question. But you could also have used the "other" triality $\tau^{-1}$, which corresponds to choosing the other spin module for $Spin(8)$.