Триви, просто проверяйте тип:
{% for product in products %}
{% if product is iterable %}
{% for item in product %}
{{ item }}
{% endfor %}
{% else %}
{{ product }}
{% endif %}
{% endfor %}
Если охота проверять ключи, то конечно не таким образом if item.name, ибо это проверка его значения на true/false. Непосредственно перебрать ключи/значения вы не сможете так как у вас массив вложенный, а если его структура будет такой (сокращено):
$arr = [
'product_id' => 30,
'thumb' => 'https://mysite/image/cache/catalog/demo/canon_eos_5d_1-200x200.jpg',
'name' => 'Canon EOS 5D',
'model' => 'Product 3',
'description' => 'Canon press material for the EOS 5D',
'price' => '50.00р',
'special' => '80.00р',
'options' => [
'product_option_id' => 226,
'product_option_value' => [
[
'product_option_value_id' => 15,
'option_value_id' => 39,
'name' => 'Red'
],
[
'product_option_value_id' => 17,
'option_value_id' => 41,
'name' => 'Green'
],
[
'product_option_value_id' => 16,
'option_value_id' => 42,
'name' => 'Yellow'
]
],
'option_id' => 5,
'name' => 'Select',
'type' => 'select',
'required' => 1
],
'href' => 'https://soniya-shop/index.php?route=product/product&product_id=30'
];
то можно проверять текущий ключ (для примера проверяется и ключ 'href', чтобы не экранировать &):
<ul>
{% for key, val in arr %}
{% if key == 'options' %}
<ul>
{% for k, v in val %}
{% if k == 'product_option_value' %}
<ul>
<li>{{ v }} опять вложение, цикл</li>
</ul>
{% else %}
<li>{{ v }}</li>
{% endif %}
{% endfor %}
</ul>
{% else %}
<li>{% if key == 'href' %}{{ val|raw }}{% else %}{{ val }}{% endif %}</li>
{% endif %}
{% endfor %}
</ul>
Хотя зная структуру массива проще проверять является ли значение итерируемым и соответственно поступать. Проверка ключа потребуется, например, если каждый из них будет иметь различный вывод.