Проблема связана с тем, что вы пытаетесь модифицировать словарь, по элементам которого итерируетесь.
В условиях вашего кода это не проблема. Но вы должны сначала прежде чем начнётся цикл с удалениями) взять список пар элементов из вашего словаря.
products.items() возвращает не список, а итератор по элементам словаря. Само собой этот итератор ломается как только вы удаляете из словаря первый элемент.
Но если этот итератор до первого удаления полностью превратить в список, то удалять потом можно что хотите.
for product_id, value in list(products.items()):
if value['g_1'] == 0:
del products[product_id]
Или так:
new_products_dict = {k: v for k, v in products.items() if v['g_1'] != 0}
Здесь создаётся новый словарь из элементов, которые удовлетворяют вашим условиям.