Which means the mosfets are operating as variable resistors and sinking the current themselves, right? Basically how y'all are saying to design it, lol. But, this is using cheap mosfets and not the more expensive linear fets.
FWIW, those cheap-ish Chinese constant current loads use generic off-the-shelf MOSFETs as power sinking elements (no way they obtain those special MOSFETs designed for linear operation), and they work, as long as heat sinking stays adequate. So at least this is something to keep in mind.
The 45A, however, poses some challenges. First off, heat dissipation. For a 2s lithium battery, worst case 4.2V*2 = 8.4V, this means you'll have to dissipate 8.4V * 45A = ~380W of power. This means a *big* heat sink with a fan (or several fans). To get an idea, check some of the more expensive CPU heatsinks, see their sizes and what levels of TDP they are designed to deal with.
Next, finding a suitable transistor won't be easy, if at all possible, at least to fit your budget with a good margin. In fact, I highly doubt that anything short of a resistor bank in a bucket of water will fit the budget, when you add up all the parts. Budget considerations aside, availability of such a transistor that can sink a continuous 45A and dissipate just below 400W is a big question as well.
Now, what do the CPU makers do when they hit the 5GHz barrier and fail to improve single-core performance any further? Right, they begin to scale performance horizontally by adding more (and more) cores and forcing poor programmers into writing programs that utilize parallelizing algorithms. See the point? You could do the same. Parallelize it. Use *several* cheaper/more easily available transistors. Each of them will have its own current sensing shunt. Each of them can have its own smaller heat sink, or they can share a single big one (good luck finding something suitable though). Since you are going to use a microcontroller, controlling them becomes trivial: read the voltage drop values from each of the shunts (amplifying them before feeding to the ADC, if necessary) and control each of the transistors' gates (or bases, if you use BJTs) individually to: a) make currents flowing through all of them equal; b) make sum of these currents equal to 45A.
If you use, say, 5 transistors, which means only 9A/75W per transistor, you enter the area where those cheap Chinese electronic loads do the job easily, meaning you can solve it using cheap components too.
The only (major) caveat here is that your microcontroller must have a sufficient number of outputs and ADC inputs to read current values and control all the transistors. You might need to use some additional controller(s) to read raw values and send them over a digital line to the main one.
Another caveat: even when current flowing through each transistor is equal, it doesn't necessarily mean that power dissipated on each of them is equal, because their characteristics may vary to some extent. However, it should be close enough, if the transistors you use are the same part number coming from the same batch. You might also read voltage drops across the transistors and control them to make power, instead of current, equal across all of them, but that'll be more difficult and smell like overengineering.
Of course, you'll also need to implement not only total overcurrent protection, but also overcurrent protection for each of the transistors to prevent a cascading magic smoke escape if one of them fails.