Sua estratégia de atualização geral é boa: você tem um repositório local (que eu suponho que você teste em um ambiente de desenvolvimento), e você atualiza tudo com base nesse repositório (eu presumo que seja bom).
A reinicialização do serviço é inevitável: se o código subjacente tiver sido alterado, será necessário reiniciar o serviço para que a alteração entre em vigor. Não fazer isso pode levar a conseqüências piores (executando código fora de sincronia com uma biblioteca compartilhada levando a uma falha do aplicativo). No meu ambiente, considero que as janelas de patch trimestrais sejam trimestrais "REBOOT ALL THE THINGS!" janelas também. A vantagem de tal política é que você sabe que seus servidores voltarão após uma reinicialização, e você saberá que eles funcionarão corretamente (porque você os testa regularmente) .
Meu melhor conselho para você é agendar os lançamentos de software (talvez isso signifique que você terá que acioná-los "manualmente" com fantoches) e aconselhar seus usuários sobre a manutenção planejada / o tempo de inatividade.Como alternativa (ou como parte disso), você pode configurar a redundância em seu ambiente, de modo que possa ter algumas máquinas ou serviços sendo reiniciados e ainda fornecer serviço aos usuários finais. Isso pode não eliminar completamente qualquer interrupção, mas pode ajudar a minimizá-las.
A redundância adicionada também protege você no caso de falhas de hardware, que são inevitáveis em uma escala de tempo suficiente.