Если бы нужно было только читать, или только писать, то использовалось бы lds/sts. Когда требуется запись/чтение много раз, то для экономии памяти программ IAR грузит указатель в пару регистров и использует ld/st. Два чтения/записи - граничный вариант, здесь от использования адресации по паре регистров нет ни выигрыша, ни проигрыша в длине кода. Но есть пригрыш в тактах и кол-ве использованных регистров, но, видимо, для IAR-овцев это уже не так важно

.
Сам я, за исключением особо критических случаев, стараюсь в нагенеренное IAR-ом не смотреть, нервы дороже

Ато придется все на ассемблере переписывать.
Если это не обработчик прерывания, то не обращайте внимания, все равно компилятор лучше человека не напишет. Если что-то достаточно критичное (и при этом не очень большое) - пишите сразу на ассемблере, так будет быстрее. Я имею ввиду не всю программу на асме писать, а только конкретную функцию.