This is a perfect case for using DOW loop and by-group processing. Process all of the scenarios in one pass. My solution closely resembles yours, but I wouldn't bother with indicators. Just capture the high and low values if they exist, then use the coalesce() function to use the min/max values if the low/high values are missing.

data want;
lowval = .;
hival = .;
do until (last.group);
set Test;
by group;
select (Type);
when ('Min') do;
min = value;
output;
end;
when ('Max') do;
max = value;
output;
end;
when ('LowVal') lowval = value;
when ('HighVal') hival = value;
end;
end;
Type = 'LowVal';
value = coalesce(lowval, min);
output;
Type = 'HighVal';
value = coalesce(hival, max);
output;
run;