The 'ORDER BY' clause is the only way to absolutely guarantee order in the SQL language. However, in T-SQL you normally get things in the order of the clustered index; is that what you meant by the default sorting on the history table? This is because the actual records are stored sorted, so the easiest thing for SQL to do is just return them in the order it finds them.
Once you specify 'ORDER BY [Actual Ship Date]', you're telling SQL Server that it only has to sort by that field, and it can ignore Serial Number. So it sorts on ship date, and then returns 100 records from an internal, sorted but temporary set of records. So it's no longer reading straight through the clustered index, and you lose the property of being sorted by Serial Number.
If you want both, add 'ORDER BY [Actual Ship Date] ASC, [Serial Number] [DESC]'.
For a bit of background reading, have a read about stable and unstable sorts. The tl;dr is that some sort algorithms will jumble up any existing order in a list when you sort by a different criteria. In your example, an already-sorted list (sorted by serial number) is jumbled WRT to the serial number because it's being sorted only by the ship date. SQL's 'ORDER BY' is an example of an unstable sort, which is why your serial numbers are jumbled.