Running the test script below, I’m finding that Shane’s original begins to overtake my modification of it somewhere between 20 and 25 “boards” — ie. between 100 and 125 strings. But if my modification’s further modified to loop through the original list in a script object, then it’s faster even than my vanilla sort. There’s still only a few thousandths of a second in it, though. 
use AppleScript version "2.5" -- OS X 10.12 (Sierra, not El Capitan) or later
use framework "Foundation"
use framework "GameplayKit" -- for shuffledArray()
use sorter : script "Custom Iterative Ternary Merge Sort"
use scripting additions
on createList(numberOfBoards)
script o
property template : {"5e", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "__Board ", "", " | ", ""}
property hex : characters of "0123456789abcdef"
property cats : {"Done", "List 1", "List 2", "To Do", "Test for Attachments"}
property listOfStrings : {}
end script
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to ""
repeat with i from 1 to numberOfBoards
set item -3 of o's template to i
repeat with j from 1 to 5
repeat with k from 2 to 23
set item k of o's template to some item of o's hex
end repeat
set item -1 of o's template to item j of o's cats
set end of o's listOfStrings to o's template as text
end repeat
end repeat
set AppleScript's text item delimiters to astid
return (current application's class "NSArray"'s arrayWithArray:(o's listOfStrings))'s shuffledArray() as list
end createList
on timeVanillaSort(listOfStrings) -- NG.
set startTime to current application's class "NSDate"'s new()
script onTextItem2
on isGreater(a, b)
return (text item 2 of a > text item 2 of b)
end isGreater
end script
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to "__"
considering numeric strings
tell sorter to sort(listOfStrings, 1, -1, {comparer:onTextItem2})
end considering
set AppleScript's text item delimiters to astid
return {VanillaTime:-(startTime's timeIntervalSinceNow())}
end timeVanillaSort
on timeOriginalASObjCSort(listOfStrings) -- Shane original.
set startTime to current application's class "NSDate"'s new()
set listOfStrings to current application's NSArray's arrayWithArray:listOfStrings
set theDict to current application's NSMutableDictionary's dictionary()
repeat with aString in listOfStrings
(theDict's setObject:((aString's componentsSeparatedByString:"__")'s lastObject()) forKey:aString)
end repeat
set theResult to (theDict's keysSortedByValueUsingSelector:"localizedStandardCompare:") as list
return {originalASObjCTime:-(startTime's timeIntervalSinceNow())}
end timeOriginalASObjCSort
on timeModifiedASObjCSort(listOfStrings) -- Shane, modified by NG.
set startTime to current application's class "NSDate"'s new()
set theDict to current application's NSMutableDictionary's dictionary()
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to "__"
repeat with aString in listOfStrings
(theDict's setObject:(aString's last text item) forKey:aString)
end repeat
set AppleScript's text item delimiters to astid
set theResult to (theDict's keysSortedByValueUsingSelector:"localizedStandardCompare:") as list
return {modifiedASObjCTime:-(startTime's timeIntervalSinceNow())}
end timeModifiedASObjCSort
on timeTwiceModifiedASObjCSort(listOfStrings) -- Shane, modified twice by NG.
set startTime to current application's class "NSDate"'s new()
script o
property lst : listOfStrings
end script
set theDict to current application's NSMutableDictionary's dictionary()
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to "__"
repeat with i from 1 to (count listOfStrings)
set aString to item i of o's lst
(theDict's setObject:(aString's last text item) forKey:aString)
end repeat
set AppleScript's text item delimiters to astid
set theResult to (theDict's keysSortedByValueUsingSelector:"localizedStandardCompare:") as list
return {twiceModifiedASObjCTime:-(startTime's timeIntervalSinceNow())}
end timeTwiceModifiedASObjCSort
on test(numberOfBoards)
set listOfStrings to createList(numberOfBoards)
copy listOfStrings to duplicateListOfStrings
copy listOfStrings to duplicateListOfStrings2
copy listOfStrings to duplicateListOfStrings3
set numberOfStrings to {numberOfStrings:numberOfBoards * 5}
numberOfStrings & timeVanillaSort(listOfStrings) & ¬
timeOriginalASObjCSort(duplicateListOfStrings) & ¬
timeModifiedASObjCSort(duplicateListOfStrings2) & ¬
timeTwiceModifiedASObjCSort(duplicateListOfStrings3)
end test
test(125) -- Param: number of boards. (5 strings per board.)