При использовании:
NSString *newText = sender.titleLabel.text;
вы просто устанавливаете указатель на существующий объект в sender.titleLabel.text. Вы говорите компилятору, что этот новый указатель указывает на объект типа NSString.
Примечание: указатели newText и sender.titleLabel.txt теперь оба указывают на один и тот же объект, поэтому изменения, внесенные в базовый объект (например, изменение текста), будут отражены при доступе к объекту с помощью либо указатели.
Примечание 2: при использовании:
NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];
Вы создали совершенно новый объект (с помощью alloc), а затем инициализировали этот новый объект со строковым значением sender.titleLabel.text во время выполнения операции alloc. Теперь newText и sender.titleLabel.text - это два совершенно разных объекта NSString, которые в любом случае не связаны друг с другом и могут быть изменены / управляемы / использованы / dealloc'd полностью независимо от друг друга.