The problem was just as you desribed. Below is a diff to restore 'B' and do the right thing on ^W. Thanks!
--- /usr/src/bin/ksh/vi.c Tue Jun 9 10:32:27 2009 +++ vi.c Tue Jun 9 10:38:15 2009 @@ -596,7 +596,7 @@ vi_insert(int ch) } if (ch == edchars.werase) { if (es->cursor != 0) { - tcursor = Backword(1); + tcursor = backword(1); memmove(&es->cbuf[tcursor], &es->cbuf[es->cursor], es->linelen - es->cursor); es->linelen -= es->cursor - tcursor; @@ -1598,9 +1598,9 @@ Backword(int argcnt) ncursor = es->cursor; while (ncursor > 0 && argcnt--) { - while (--ncursor >= 0 && !is_wordch(es->cbuf[ncursor])) + while (--ncursor >= 0 && isspace(es->cbuf[ncursor])) ; - while (ncursor >= 0 && is_wordch(es->cbuf[ncursor])) + while (ncursor >= 0 && !isspace(es->cbuf[ncursor])) ncursor--; ncursor++; }