Почему не работает так, как надо?
Потому что литерал [] объявляет новый список, а оператор * копирует ссылку на тот же список.
Потому что во втором коде вы делаете в списке b три ссылки на один и тот же экземпляр списка, а в первом - три разных экземпляра списка в списке b.