Thanks for the interesting article. As has been pointed out, the same improved query plan (using the index seek) can be achieved by adding the "IS NOT NULL" condition to the WHERE clause. Equivalently, I noticed that adding a condition such as "AString > '0'" will also result in the same query plan. It is essentially a meaningless condition in this context, except that it also eliminates the NULL values.
Not that this achieves anything more, but I believe the crux of the matter is that including a sargable condition, such as "AString IS NOT NULL" or "AString > '0'," in the WHERE clause, joined to a non-sargable condition, such as "AString LIKE '%221%', with the AND operator, will result in an index seek. If you look at the properties of the index seek operator in the plan, you'll see that, in addition to the seek predicate containing the sargable condition, there will also be a predicate containing the non-sargable condition.
If you had no NULL rows, then the following query will still have a plan with an index seek:
WHERE AString IS NOT NULL AND AString LIKE '%221%';
However, it will perform no better than an index scan, as I believe your test results showed. That is, calling it a seek doesn't mean it's any better, in that case. It's basically "seeking" every row in the table, and then checking a filter on every row, just like a scan.