В приведенном вами словаре на первом уровне одини и те же ключи (id, name, child) повторяются 2 раза и перезаписываются.
Но в общем случае я бы для такой задачи написал рекурсивную функцию.
Например:
def print_recursive(data, offset=''):
def is_leaf(element):
return not bool(element.get('child'))
if is_leaf(data):
print(offset + '<li>')
print(offset + data.get('name'))
print(offset + '</li>')
return
print(offset + '<ul>')
print_recursive(data['child'], offset=offset + ' ')
print(offset + '</ul>')
arr = {} # тут ваш словарь
print_recursive(arr)