Интересный вопрос, и я не знаю ответа, но никакое количество не дурачится с блоками и прочим, не сработает. Я посмотрел в сгенерированных файлах шаблонов php кеша. Когда вы выводите переменную, она выглядит следующим образом:
// {{ testvar }}
echo twig_escape_filter($this->env, $this->getContext($context, "testvar"), "html", null, true);
Так что, в основном, он сначала ищет testvar в вашем локальном контексте. Если он не найден, он выглядит в глобальном контексте.
Когда вы устанавливаете значение тестовой переменной, вы получаете:
// {% set testvar = 'level one' }}
$context["testvar"] = "level one";
Таким образом, обновляется только локальный контекст. Измененное значение исчезнет, когда вернется включенный шаблон.
Так что по умолчанию, по крайней мере, похоже, что глобальные переменные действительно доступны только для чтения.
Это может быть возможно сделать через расширение. Я не знаю достаточно о внутренностях.