First version is now done and tested. I got an idea to use frozen water glycol mixture as cold source and then heat with a resistor. I have 3-6 cm polyurethane insulation with 12x12x12 cm inner space. M4 fixing screws go through the insulation and are made of 316L, which has much lower heat conductance than normal steel. Total heat capacity is about 1.8 kJ/C (based on BOM including insulation). I have 0.18 l of 39% vol ethylene glycol in an aluminum case with good heat transfer to DUT. That should have 49 kJ latent heat at -23C and heat capacity of 1 kJ/C (including the case and included to the 1.8 kJ/C total).
So based on calculations (assuming no heat flux through the insulation) I should get a bit under -20C when all the glycol water has melted when starting at +30C. In practice I got only a few degrees below zero, but I'm not absolutely sure that all the glycol water had time to freeze before the experiment. The DUT cooled down over 20C in the first 3 minutes and reached zero in 12 minutes. The peak was at 26 minutes and T was less than 1C from the peak for more than 20 minutes.
After all the glycol water had melted (~40 min after inserting it) the DUT began to warm up at ~1C in 10 minutes. Then I started to heat it up with a 50 W halogen bulb inside the glycol water. First at 5 W and then 10 W, 20 W and 40 W. I had 40 W on from ~16C for 54 minutes. At ~49 minutes I could hear boiling, probably only at the surface of the bulb. The DUT peaked at 89C (10-15 minutes after heating was turned of) and then started to cool down at ~1 C in 5 min. Now, 8.5 hours after I stopped heating, DUT is at 42C while ambient is about 23C. DUT is on using 0.8W. According to calculation the balance T at 0.8W should be about 8C above ambient, but DUT has also local gradients, thus I'd expect the balance T measured on the PCB to be around 13C above ambient.
Looks very promising! I need a bit more to get all the way to -20C, maybe it is enough to properly freeze the glycol water, I need more of it or I need to cool down DUT a bit with other methods (e.g. another patch of glycol water) before inserting the glycol water. Then I can sweep the whole temperature range at 1C in more than 5 minutes or up to 1.5 C/min with 50W heating.