More than apps liking to make custom interfaces, I think it’s more that companies like to try to make their UI into a brand, necessitating a high level of customization. If you look at the majority of FOSS software, even much of it that’s held in better regard by users (e.g. Krita), highly custom UI is considerably more unusual.
There’s not much that can be done about UI-as-branding unfortunately, but for everything else I believe that parameterization is the answer. Don’t hardcode colors, fonts, etc and instead favor framework-provided presets (like UIColor.systemBackground and UIFont.caption1 on iOS) wherever practical and that’ll for the most part make your app remain usable regardless of how the user’s themed their system, short of just using a badly made theme. This should be done anyway because it’s a huge boon to accessibility if the user can e.g. enable colorblind mode and have the reds and greens in apps adjust automatically because their devs were thoughtful enough to use Color.systemGreen and Color.systemRed instead of hardcoding #FF0000 and #008000.
There’s not much that can be done about UI-as-branding unfortunately, but for everything else I believe that parameterization is the answer. Don’t hardcode colors, fonts, etc and instead favor framework-provided presets (like UIColor.systemBackground and UIFont.caption1 on iOS) wherever practical and that’ll for the most part make your app remain usable regardless of how the user’s themed their system, short of just using a badly made theme. This should be done anyway because it’s a huge boon to accessibility if the user can e.g. enable colorblind mode and have the reds and greens in apps adjust automatically because their devs were thoughtful enough to use Color.systemGreen and Color.systemRed instead of hardcoding #FF0000 and #008000.