You should be able to just dereference the iterators directly with a more recent version of Thrust:
typename std::iterator_traits<Output_iterator>::value_type value = def_value;
for (uint32 i = begin; i < end; ++i)
value = op( value, in_values[i] );
out_values[leaf_id] = value;