This way of updating rows is the fastest way, however it doesn't take part in tracking, so it's not suitable method for you.
you can replace rowData[ dataIndx of column B ] = cellData; by updateRow() method if you want to make the changes integral part of tracking. Though it meets your 1st requirement (tracking ), it would lead to as many change events as the number of times the updateRow() method is called so it doesn't meet your 2nd requirement (single change event ).
As you want to make the whole operation a single transaction with a single change event, there is a need for an appropriate method i.e., updateRows() method in the API.
updateRows() is being added in the API and would be available in the next version.