You can probably simulate textInput
events to manipulate the contents of the textarea. The changes made that way are respected by undo/redo, I think (I know they are in Safari)
var element = document.getElementById('someTextarea');
var text = 'This text will be inserted in the textarea';
var event = document.createEvent('TextEvent');
event.initTextEvent('textInput', true, true, null, text);
element.dispatchEvent(event); // fire the event on the the textarea
Basically, the text is inserted as though you pasted it yourself. So if something is selected, it'll be be replaced with the text. If there's no selection, the text will be inserted at the caret's position. And undo/redo should work normally (undoing/redoing the entire inserted string in one go), because the browser acts as if you typed/pasted it yourself.
As I said, I know this works like a charm with undo/redo in Safari, so I'd assume it works in Chrome as well.