Результат сохраняется в самом объекте Future.Он не хранится на стороне сервера.
Поток 1 отправляет Callable Исполнителю.Этот исполнитель создает Runnable, который реализует Future и который оборачивает вызываемый объект и его будущий результат.Он возвращает это будущее.
Поток 2 от исполнителя выполняет исполняемое будущее.При запуске будущее исполняет свой вызываемый вызов и сохраняет результат вызова в своем поле результата.
Поток 1 запрашивает результат из будущего, а будущее возвращает результат, сохраненный в его поле результатов.
Посмотрите на исходный код и документацию по java.util.concurrent.FutureTask,