Of course did red marker should disappear after you commit the record changes in the store. The red marker is placed automatically in dirty cell in editable grids so why do you want to do it manually.
Anyways u can add the ".x-grid3-dirty-cell" css class to the cell you are interested in, never tried it but it make work.

Answering your question why I am doing it manually, there is logic in my module to refresh certain cells not rows.So I have to commit the records for doing it,but while committing the red icon vanishes.

Actually setDirty will not help such as inside set method of Record class there is a check whether value was changed or no. To achieve what you need i overrode Record class and added ignoreEqualsCheck parameter to set method. So i got next code in Record class

Code:

/**
* Set the named field to the specified value.
*
* @param name the name of the field to set
* @param value the value of the field to set
*/
public void set(String name, Object value) {
set(name,value,false);
}
/**
* Set the named field to the specified value.
*
* @param name the name of the field to set
* @param value the value of the field to set
* @param ignoreEqualsCheck whether or not check previous value to mark dirty cells
*/
public void set(String name, Object value, boolean ignoreEqualsCheck) {
Object o = model.get(name);
if (!ignoreEqualsCheck&&Util.equalWithNull(o, value)) {
return;
}
dirty = true;
hasChange = true;
if (modified == null) {
modified = new RpcMap();
}
if (!modified.containsKey(name)) {
modified.put(name, o);
} else {
Object origValue = modified.get(name);
if (!ignoreEqualsCheck&&Util.equalWithNull(origValue, value)) {
modified.remove(name);
if (modified.size() == 0) {
dirty = false;
}
if (validMap != null) {
validMap.remove(name);
}
}
}
model.set(name, value);
if (!editing && store != null) {
store.afterEdit(this);
}
}

Then in my client code to mark grid cell as dirty even without actual value changing i use next approach