При использовании range( ), через N-ное количество циклов падает скорость?
Потому что в целом подход неправильный. Вы каждый цикл создаете новый объект и просто его отрисовываете поверх других, сдвигая каждый раз на новую величину.
Вместо этого нужно 1 раз создать свой Circle и его уже потом двигать (и двигать соответственно не на i, а на одинаковое фиксированное значение (если ожидается равномерное движение).
И наверное в цикл стоит добавить задержку в виде time.sleep(0.01)
obj = Circle(Point(150, 20), 15)
obj.setWidth(1)
obj.draw(win)

def down():
    for i in range(250):
        print (i)

        obj.setFill("yellow")
        obj.move(0, 1)
        time.sleep(0.01)
Принты заметно замедляют программу, попробуйте без них ;) И действительно, некоторые переменные вы можете не пересоздавать, я не про генератор. Вы можете в цикле создать ваш объект Circle, и передавать его в функции up и down и изменять его, а не каждый раз создавать - затратная однако операция.