Сообщения не могут быть обработаны, пока ваше приложение не войдет в цикл обработки сообщений, поэтому любая попытка изменить / обновить состояние управления, основанное на обработке сообщений, не будет работать в пределах одной последовательности кода, которая не «прокачивает» сообщения.
К счастью, элементы управления VCL обычно предоставляют средства для перерисовки без ожидания обработки сообщений с помощью метода обновления:
Button1.Enabled := False;
Button2.Enabled := False;
Button1.Update;
Button2.Update;
Это работает независимо от необходимости отключать перерисовку формы. Форма не будет перекрашиваться до тех пор, пока ваше приложение в любом случае не войдет в цикл обработки сообщений, поэтому отключение рисования формы и повторное включение в одной процедуре, которая сама по себе не вызывает обработку сообщения, является пустой тратой времени.
Это может быть не совсем одновременное перекрашивание двух кнопок, но по-настоящему одновременное рисование двух отдельных элементов управления невозможно без проникновения в многопоточный код рисования GUI, который, я думаю, выходит за рамки этой проблемы. Таким образом, вызов Update для двух кнопок будет практически одновременным, если вам нужно.