are these template entities? If yes, variables for template entities only get resolved on configuration load, they do not update live before resolution of the state. Which is why it only works when you hardcode the value.
With that being said, do this instead:
- unique_id: weather_display_hourly_icon0
variables:
<<: &conditions
fallback:
icon: "\uF00D"
conditions:
clear:
icon: "\uF00D"
cloudy:
icon: "\uF013"
cyclone:
icon: "\uF0C1"
dust:
icon: "\uF082"
dusty:
icon: "\uF082"
fog:
icon: "\uF014"
frost:
icon: "\uF076"
haze:
icon: "\uF021"
hazy:
icon: "\uF021"
heavy_shower:
icon: "\uF008"
heavy_showers:
icon: "\uF008"
light_rain:
icon: "\uF01A"
light_shower:
icon: "\uF009"
light_showers:
icon: "\uF00A"
mostly_sunny:
icon: "\uF00C"
partly_cloudy:
icon: "\uF002"
rain:
icon: "\uF019"
rainy:
icon: "\uF019"
shower:
icon: "\uF009"
showers:
icon: "\uF009"
snow:
icon: "\uF01B"
snowy:
icon: "\uF01B"
storm:
icon: "\uF01E"
storms:
icon: "\uF01E"
sunny:
icon: "\uF00D"
tropical_cyclone:
icon: "\uF073"
wind:
icon: "\uF050"
windy:
icon: "\uF050"
state: >
{% set descriptor = states('sensor.rutherglen_icon_descriptor_0') %}
{{ conditions.get(descriptor, fallback).icon }}
Then using it…
- unique_id: weather_display_hourly_icon1
variables:
<<: *conditions
state: >
{% set descriptor = states('sensor.rutherglen_icon_descriptor_1') %}
{{ conditions.get(descriptor, fallback).icon }}