You are correct. When the client uses write value, the CYBLE_EVT_GATTS_WRITE_REQ event is triggered on the server, whereas CYBLE_EVT_GATTS_EXEC_WRITE_REQ is triggered when the client writes using Write Long Characterisitc Value.
The stack is designed in such a way that the the "long value" is written automatically to the GATT DB on the server when it gets CYBLE_EVT_GATTS_EXEC_WRITE_REQ event. On the other hand, when the CYBLE_EVT_GATTS_WRITE_REQ event is triggered, the designer can choose to update the GATT DB.
To answer your in short, it behaves so because it is designed so.
If you wish to update the GATT DB when you get CYBLE_EVT_GATTS_EXEC_WRITE_REQ, you should read the value and then re-write it.