Interesting. Let's formalize your argument.
Assume our programs take a natural number parameter as input, the programs are numbered $f_1, f_2, f_3, \ldots$, and an interpreter $I$ is a function satisfying $$I(m,n) = f_m(n).$$ The claim is that $I \ne f_k$ for any $k$ (where the pair of inputs to $I$ is encoded as a single natural number input to $f_k$ in some reasonable way, and $f_k$ decodes it as needed. I won't worry about these details and just write $f_k$ as if it took 2 parameters. Here we are making the implicit assumption that our language is powerful enough to do this encoding and decoding. Indeed the result is false for very weak languages.)
Assume that $I = f_k$ and define $p(n) = f_k(n,n)$. Then $p$ is also a program in our language (again, we are assuming that our language is powerful enough for this construction), and hence $p = f_j$ for some $j$. Thus $f_j(n) = f_k(n,n)$. Now let $n=j$ and we get $$f_j(j) = f_k(j, j) = I(j,j).$$
Unfortunately, as you can see by comparing this to the previous displayed equation, we have not reached a contradiction, so this argument does not quite work. The problem is that the "infinite loop" you get from "running" the program in the interpreter assumes that the interpreter will run the program step by step. But there's actually no such requirement. The interpreter could be any function satisfying $I(m,n)=f_m(n)$ and we have no idea what the implementation may be.
However, the argument is easily fixed. Just define instead $p(n) = f_k(n,n) + 1$ (here I am assuming the outputs of our functions are encoded as natural numbers too, and the language is powerful enough to do the +1 operation). Then repeating the above argument we get $$f_j(j) = f_k(j,j) + 1 = I(j,j) + 1$$ and now this is a contradiction because $f_j(j) = I(j,j)$ by definition.