Будет ли рассчитано значение выражения strlen("str") на этапе компиляции или при выполнении?
Вообще нет. Но, если компилятор сочтет что ваша строка не меняется (а это так и есть), он может оптимизировать этот код, заменив его константой. К стати, он еще и len тогда может выкинуть, заменив его константой в выражениях ниже.
Сказать что он наверняка заменит можно только точно зная какой компилятор используется  и опции компиляции.
gcc с -O3 100% выкинет эту строку  и заменит константой выражения для a и b, а вот с -O0  скорее всего трогать не станет.
Чтобы наверняка быть уверенным, что компилятор ничего не оптимизирует можно применить volatile, но в большинстве случаев для этого нет причин.
Вряд ли.