Почему бот не работает так, как это планировалось?
Нужно сначала проверить выполнение всех белых условий, и только потом проверять чёрные условия, если ни одно белое не сработало. Иначе - при первой же непрошедшей белой проверке начнёт проверять чёрные и удалит сообщение.
Можно просто проверять как пересечение двух множеств
if set(white_list_roles) & set(message.author.roles):
    # я админ, могу ругаться
else:
    # я холоп, ругаться нельзя
    if any(bad_word in message.content for bad_word in black_list):
        await message.delete()
Для учета регистра нужно там же использовать содержимое сообщения в нижнем регистре message.content.lower()

В данной постановке не совсем понятно, как именно должен учитываться список разрешенных слов?