I quickly tried that, but I get a reasonable result:

with
typedef uint8_t UINT8;
typedef uint16_t UINT16;
typedef uint32_t UINT32;
#define CAN_FRAME_DATA_LEN 8
typedef union unCanFrameData
{
UINT8 u8Data[CAN_FRAME_DATA_LEN]; ///< 8 uint8 data
UINT16 u16Data[4]; ///< 4 uint16 data
UINT32 u32Data[2]; ///< 2 uint32 data
}UN_CAN_FRAME_DATA;
and
unData.u16Data[2] = 2000;
I believe it could be some compiler settings you are using (can you share a small example project)?
I used the S32K144 (don't think it matters), but can you check that 0x2000'ef58 you indeed have RAM?
I hope this helps,
Erich