I found the reason - it was a basic .NET mistake and not something to do with PerformanceCounters. If I pass an object (in this case a PerformanceCounter) that is null to a method and set it to an instance of an object, the original null reference is not updated to point to the new object. This means that the PerformanceCounter will continue to be null.
The solution is to instantiate the PerformanceCounter before calling the method...
This solution, unfortunately, is not really relevant to the core topic of the question asked, but I didn't know that at the time of asking it.