The population change is hardcoded in the DLL:
CvPlayer::acquireCity
For buildings, the capture conditions are checked a few lines below. That logic is mostly based on data loaded from Civ4BuildingInfos.xml, specifically the bNeverCapture and iConquestProb elements. Would be a bit laborious to go through all buildings in XML, but technically very easy to do. If you're comfortable with
setting up a development enviroment for the DLL, then changing the DLL code would be quicker and, in a way, cleaner. If that's not an option, then the 1 population could perhaps be added back in a Python script; the DLL fires a city-kept event
toward the end of the acquireCity function. Might be tricky (impossible?) to tell in Python whether the city had only 1 population to begin with and therefore hasn't actually lost any.