Я думаю, что вы ошибаетесь из-за того, как работает подстрока.
2-й параметр - это длина строки, которую нужно извлечь, а не индекс, к которому вы хотите закончить - MSDN Ref
Параметры
startIndex Тип: System.Int32 Начинающаяся с нуля позиция начального символа подстроки в этом случае.
length Тип: System.Int32 Количество символов вподстрока.
Вы хотите указать 30 для второго параметра, поскольку вы хотите разделить его на 30 блоков символов.
Я думаю, что это должно работать (но код действительно нуждается вбыть приведенным в порядок!):
((dr["MESSAGE"].ToString().Trim().Length < 30 && test != "")
? (dr["MESSAGE"].ToString() + "|||||")
: (dr["MESSAGE"].ToString().Trim().Length > 150 && test.Trim().Length < 181)
? dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(0, 30).Trim() + "|" +
dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(30, 30).Trim() + "|" +
dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(60, 30).Trim() + "|" +
dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(90, 30).Trim() + "|" +
dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(120, 30).Trim() + "|" +
dr["MESSAGE"].ToString().Trim().PadRight(180, ' ').Substring(150, 30).Trim()
: "|||||");
Этот вопрос - Разделение строки / числа на каждый N-й символ / число? может помочь вам с более приятным кодом