O que é um instalador? Bem, um instalador prepara um sistema para permitir que um programa seja executado: ele instala esse programa. Durante esse processo, um instalador (no Windows) pode copiar arquivos em locais do sistema, colocar atalhos para iniciá-lo, atualizar bibliotecas, remover versões mais antigas, etc. Não existe um padrão ou formato de instalador universal; qualquer programa que executa essas ações ("instala" outro programa) pode ser chamado de instalador.
Um arquivo "exe" no Windows é conhecido como o arquivo Portable Executable e contém instruções arbitrárias, seja uma máquina nativa código ou .NET bytecode. Não há nada sobre o formato PE que irá identificá-lo como um instalador. Claro que, com código de máquina arbitrário, você pode escrever um instalador - e os instaladores "exe" que você vê adotam essa abordagem.
Algumas pessoas escrevem seus próprios instaladores personalizados. Outros usam geradores de instaladores para economizar tempo e esforço; estes incluem NSIS, InnoSetup, InstallShield e muito mais.
MSI é um formato específico usado para armazenar informações sobre uma instalação, um banco de dados sobre as etapas a serem executadas e quais arquivos para colocar onde. Por si só, não é executável; Na verdade, ele é interpretado por msiexec.exe
em sistemas Windows. Este intérprete seguirá as etapas descritas no arquivo MSI. Você poderia, em teoria, criar qualquer exe que usa um banco de dados semelhante ao MSI (e NSIS, InnoSetup, etc., fazer algo semelhante).
O que torna a MSI especial é que ela é incluída e interpretada por ferramentas internas e também integrada ao Active Directory para facilitar a implantação em várias máquinas em um ambiente corporativo, e a resposta da Clem aborda isso com mais detalhes.