Tem algumas formas de se fazer isso, vamos pensar no cenário mais simples em uma aplicação desktop.
Se prestar atenção, você vai ver que ao instalar no seu PC, alguns programas também instalam outros programas menores e é comum que sejam chamados de "alguma coisa updater". Isso tem no Acrobat PDF, no Google Chrome, no AnyDesk e etc.
Ou seja, a responsabilidade de buscar e realizar as atualizações não é do programa principal que o usuário utiliza, mas de um outro agente.
E para fazer isso, esse agente/updater verifica a versão instalada no seu PC, depois consulta algum serviço web para obter as informações de atualização se houver. E se ele encontra, ele baixa as atualizações em um diretório de trabalho, notifica o usuário e substitui os arquivos necessários ou simplesmente chama o instalador mais atualizado mantendo as configurações de usuário.
Esse é um cenário simples, e apenas uma das infinitas possibilidades.
Eu já fiz algo semelhante, mas não era um updater a parte, era um launcher da aplicação que além de verificar se o ambiente como banco de dados, rede e etc estavam ok, ele também buscava por atualizações. O Discord faz isso se não me engano.