Может, не самый оптимальный вариант – заменить пробелы внутри скобок на какой-то символ, который в «нормальном» тексте точно не встретится. Например, специсимвол неразрывного пробела. После этого можно бить по пробелам, и после этого обратно заменить спец-символ на пробелы:
function convert(s) {
var c, i, bo = 0, div = "\u0083", arr = s.split('');
for( i = 0; i < arr.length; i++) {
c = arr[i];
if( c === '[') {
bo++;
} else if( c === ']') {
bo--;
} else if( bo > 0 && c === ' ') {
arr[i] = div;
}
}
return arr
.join('')
.split(' ')
.map( function(s){ return s.replace( new RegExp(div,'g'), ' ')})
;
}
var s = "слово1 слово2 [слово слово слово] слово3";
convert(s) // ["слово1","слово2","[слово слово слово]","слово3"]