The ARM compilers have for the last 20 years always aligned the size of structs to a multiple of 32 bits to ensure that members following a structure are appropriately aligned.
ARM has (or had) another one for the unwary, bitfields were also always 32bits.
...
The only solutions are: use the GCC packed attribute, redesign the structures...
It is probably enough to mark the inner structure containing the three byte fields 'packed'. Marking it aligned(1) might also have the desired effect. The outer structure should then be ok. But would need to use a specially named attribute so it doesn't get removed.
In the past I've had to replace a struct with an array in order to avoid a similar alignment rule for structs.
David