So I've found the issue and I don't pretend to understand the code, but the way it seems to go is in ModuleSabreHeating.cs is there are calculations related to precoolers vs intakes but because the precoolers have intakes included the "cooling" was only being applied to this intake and no others.
This made the intake I put in front of the precooler heat the engines. Remove all intakes (except the ones inbuilt into the precoolers, which can't be removed) and problem solved, no more overheating engines.