Доставайте выделенный текст через selectionStart/selectionEnd и заменяйте их через replace таким образом:
var e = textarea, // Ссылка на текстовое поле
st = e.selectionStart, // Начало выделения
en = e.selectionEnd; // Конец выделения
e.value = e.value.replace(e.value.slice(st, en), '[b]' + e.value.slice(st, en) + '[/b]');
Для IE немного по-другому: document.selection.createRange().text возвратит выделенный текст.