Christian - You figured it out yourself. I'll elaborate.
Look at the vendor bundle defined in App_Start/bundleconfig.cs and then look at the script loading near the bottom of index.cshtml (~line 29).
You'll see that all 3rd party scripts - including the knockout script - are loaded together ... before Require. That means that none of the 3rd party scripts can detect the forthcoming use of require. Therefore, they load themselves into the global namespace (window).
When RequireJS comes along, it does not know about any of these services either. So when you ask for 'ko' as a dependency, it returns null
... as you can see for yourself if you put a breakpoint where your function begins.
All of this is by design.
You can shim these services into require's equivalent of an IoC container. If you did so, require would find 'ko' and your function would work. You can begin to learn about this here. I've done it. It's not too bad.
But some of us who have been swimming in these waters for a while have decided it's too much of a PITA. So we follow Durandal's simplifying recommendation: "Load a few 3rd party libraries outside of Require and let them litter the global namespace; your more numerous application files should live within Require."
It is not that hard to choose otherwise. Just learn to shim require in your main.js and you'll be in business.