Nice and clean implementation. I tested this with the tests (the new ones) of my implementation and they all passed (skipping the tests with chunkSize == 0).  

The code could be sligthly more readable by having some vertical space to group related code, for instance after validating the input.  

You could improve this a little bit by just having this  

    if (chunkSize == 1)
    {
        yield return value;
        yield break;
    }  

after the validation, in this way you wouldn't need to create a `StringBuilder` nor having the `enumerator`.  

___  

A slightly different approach could be to remove the `for` loop. It makes the intent more clear (IMO) and removes the need to double check return value of `enumerator.MoveNext()`.  

Unfortunately this makes the code 2 lines (3 with the vertical spacing) longer  

            var sb = new StringBuilder(chunkSize);
            var enumerator = StringInfo.GetTextElementEnumerator(value);
            var counter = 0;
            while (enumerator.MoveNext())
            {
                counter++;
                sb.Append(enumerator.GetTextElement());
                if (counter == chunkSize)
                {
                    yield return sb.ToString();

                    sb.Length = 0;
                    counter = 0;
                }
            }
            if (counter > 0)
            {
                yield return sb.ToString();
            }

___  

Regarding naming of unit tests, I usually (not in the posted question of mine) use the pattern   

UnitOfWork_StateUnderTest_ExpectedBehavior  

like shown in the accepted answer over here: [unit test naming best practices][1]


  [1]: https://stackoverflow.com/questions/155436/unit-test-naming-best-practices