I guess that's because more than 1 bad word was found. Just put a return inside the loop to end the script as soon as it finds a bad word.

Code:
on *:LOAD:{
/set %Bannword word1 word2 word3 word4
}

ON @*:TEXT:*:#: {
  IF ($nick !isop #) {
    VAR %i = 0
    WHILE (%i < $numtok(%Bannword,32)) {
      INC %i
      vAR %current.word = $gettok(%Bannword,%i,32)
      IF (%current.word isin $strip($1-)) {
      msg # .ban $nick
      return
      }
    }
  }
}