Определенно второй, если речь идет только об оптимизации памяти. Первый выделяет строку в дополнение к статически выделенному, с которым вы ее инициируете (плюс накладные расходы на выделение объекта в куче).
NSString *newText = [[NSString alloc] initWithString:@"Hello World"];
Этот фрагмент динамически распределяет копию «Hello World», но «Hello World» должен существовать где-то, чтобы его сначала скопировали. ;)
Следует также отметить, что компилятор будет повторно использовать одни и те же ссылки на идентичные строки, когда это возможно, поэтому, если вы определите пять строк с «Hello World» в качестве их содержимого, на самом деле будет только одна.