for s in services:
for c in clients:
client_data = {'name':'text', 'data': [0,0]}
client_data['name'] = c.fullname
service_tasks = db.query('SELECT * from task WHERE client=$client AND service=$service',{'client':c.id, 'service': s.id})
client_data['data'][i] = len(service_tasks) # вот тут логическая ошибка помоему
i+=1
data.append(client_data)
out of a range получается изза того что client_data содержит слишком много значений(много списков в списке в данном случае). если Вам, как я понял, необходимо получить вывод типа: {"имя" : "имя клиента", "услуга_1" : "количество_использований_услуга_1", "услуга_2": "количество_использований_услуга_2", ....}, то надо суммировать чтото а не просто добавлять списки в список. и не будет out of a range. но это если я правильно всё понял.