To me, the question about customization is orthogonal to the micro services/modular monolith question. I.e. they are not really related.
From what I have read the main benefit of micro-services seem to be reduced inter-team dependencies. Monolithic development have a problem that when the software is released, all teams have to be done with their features. So it requires synchronization between teams. And, and that becomes more difficult as the number of teams grow. Micro-services solve this by allowing each team to release updates independently. Easier scaling and fault tolerance is also a nice bonus.
A modular monolith would still require a single release, so would still require at least some synchronization. But it might still be appropriate for smaller teams where this is less of an issue. I would personally lean towards a modular monolith since I consider microservices a bit over-hyped, but it would entirely depend on your application.
Customization might be done by using feature flags, configuring simple logic expressions, configuration with some kind of simple runtime script, a full on plugin system, or replacing entire software component with customized versions. But I do not see how microservices would solve issues like loading/unloading custmized code without a restart. Unless you have one microservice per customer, you would just move the same problem to the microservice.
If you go for some kind of plugin system for customizations there are often ways to manage loading/unloading of code at runtime, but it will probably depend on the language, and may be better to ask in a separate question.