Ты не прав в следующем: отрисовка идет в методе paint этот метод вызывается только и только тогда когда было известно, что состояние компонента обновилось и его надо перерисовать.
Соответственно у тебя и получается, что он перерисовывается только когда ты изменяешь размер.
Самое простое изменение, которое можно сюда внести - это с определенной переодичностью дергать метод repaint() который будет оповещать о том, что окно апплета надо перерисовать.
Вообще есть немного более красивый вариант - у тебя объекты Circle в любом случае наследуются от Component, поэтому не риуй руками их каждый раз и просто добавляй их внутрь окна апплета (правдо желательно все же использовать lightweight компоненты в качестве базового класса - JComponent)
предварительно у апплета убери лэйаут setLayout(null) и просто меняй координаты объектов Circle, помещенных в окно апплета. Таким образом никакого кода дополнительно отвечающего за перерисовку не потребуется.
Также поток на каждый объект - это расточительство используй один поток для обработки всех объектов.
Вообще в пятой яве появились новые средства для работы с потоками - можешь ознакомиться с пакетом java.util.concurrent.*.
Где-то так...