Метод Synchronize нужен только тогда, когда происходит обращение к VCL (и не только к VCL) объектам, находящимся В ГЛАВНОМ ПОТОКЕ ПРИЛОЖЕНИЯ. В данном же случае все компоненты находятся в дополнительном потоке, так что с этим проблем быть не должно.
Я бы грешил на какие-нить объекты синхронизации внутри самих компонентов доступа к БД. Но в таком случае тормозился бы второй поток, т.к. первый уже их занял.
Так что тут, видимо, действительно дело в прямом вызове метода Execute, который, вообще-то, должен быть в секции protected, но ТСом перенесен в секцию public, что и позволило вызвать этот метод напрямую в основном потоке приложения, а не создавая дополнительный поток.
ТС, поменяй вызов Execute на выов Resume и наступит тебе счастье
