Bem, arquivos de dados são abertos por programas. E os próprios programas / arquivos executáveis abrem esses arquivos e interpretam os dados.
Arquivos executáveis são abertos / executados pelo SO para a CPU. Eles contêm instruções que são dados para a CPU.
Se um arquivo de dados contivesse instruções para uma CPU, normalmente não iria para a CPU porque é apenas um arquivo que seu programa está lendo, então no máximo ele pode ter instruções para o seu programa. Mas se algo der errado em um programa, como um arquivo de dados causa um estouro de buffer em um programa, então o que está no arquivo de dados poderia ser enviado para a CPU.
Alguém poderia renomear um arquivo jpg para executá-lo e ele será executado pela CPU e dar um erro, a menos que ele realmente tenha um código de máquina (instruções da CPU), então é realmente um arquivo executável que estava errado extensão e agora tem a extensão correta.