Finalmente lo resolví de una manera no muy óptima pero que funciona...
Básicamente lanzo la BAPI dos veces y limpiando las tablas después de cada ejecución.
De esta manera si que lo cambia.
Dejo la solución por si a alguien le ayuda
DO 2 TIMES.
CLEAR ls_item.
ls_item-item_no = 'XXXXX'.
ls_item-material = 'XXXXXX'.
ls_item-material = |{ ls_item-material ALPHA = IN }|.
ls_item-target_qty = X.
ls_item-net_price = 'XXX.XX'.
APPEND ls_item TO lt_item.
CLEAR ls_itemx.
ls_itemx-item_no = 'XXXXX'.
ls_itemx-material = abap_true.
ls_itemx-target_qty = abap_true.
ls_itemx-net_price = abap_true.
APPEND ls_itemx TO lt_itemx.
CALL FUNCTION 'BAPI_CONTRACT_CHANGE'
EXPORTING
purchasingdocument = 'XXXXXXXX'
* testrun = lv_salida
TABLES
item = lt_item
itemx = lt_itemx
return = lt_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR: lt_item, lt_itemx, lt_return.
REFRESH: lt_item, lt_itemx, lt_return.
ENDDO.