If this is a Number:Temperature Item OH can do that for you in Blockly. You can ask for the value in what ever unit you need.

Maybe. The challenge is I don’t see a block to get the raw number from a Quantity. So doing the math with units is going to be a pain. As far as I can tell what you’ll need to do is get the numericState from the outside temp Item, assuming that’s in °C you’ll need to do the math to convert it to °F yourself, and then do the calculation to get the target humidity.
It’s awkward enough that I would recommend against it and to use a text rule instead. In JS the rule’s action would look something like:
var rawOutTempF = items.OutsideTemp.quantityState.toUnit('°F').float;
var targetHum = (rawOutTempF / 2) + 25;
items.HumidifierTarget.postUpdate(targetHum + ' %');
The problem is temperature is weird in that 0 isn’t the same value for °F, °C, and K. In order to do any meaningful math what OH does is convert everything to K, does the math, then converts it back. But when doing a calculation like this, that doesn’t give you the answer you need.
For example, given 27 °F (my current outside temp) if I divide by 2 °F gives 1.05… If I divide just by 2 I get -216.20... °F (notice how the units got canceled out for the first operation but not the second). And Blockly doesn’t provide a block to convert a Quantity to a number.
Your approach as described is sound over all.
Unfortunately it cannot. Maybe one day but not yet. Avoiding a rule by using a Script transformation profile doesn’t really save anything. But it doesn’t cost anything either so it becomes a matter of preference.
Here is what it would look like as a JS script transformation profile. You’d link the outside temperature Channel to a Number:Dimensionless Item with unit=%. On the link you’ll choose “SCRIPT ECMAScript (ECMAScript 262 Edition 11)” from the list of profiles and for the Thing to Item " field enter:
| ((Quantity(input).toUnit('°F').float / 2) + 25) + ' %'
When the outside temperature updates, the update will be converted to a Quantity, converted to °F, and then we strip the units from the value to get a plain number. I don’t normally recommend stripping the units like this but ultimately we are changing from temperature to percent so it makes sense. We do the calculation and then append the new unit to the result.
The code above is what it would look like in a rule. Essentially it’s the same thing.
I’ve had very satisfactory results. What didn’t go well for you?