Mike's answer is correct, but I'd like to bring up a few more topics for discussion.
You asked how UILabel works, and it uses Core Text's font cascading, which is the font substitution that Mike alluded to. It's documented in the Core Text Programming Guide. In particular, it calls out CTFontCreateForString as using font cascading, which may help you out if you're still having problems. If not, you may want use the kCTFontCascadeListAttribute to make sure there's a Japanese font in your cascade list.
"Core Text font references provide a sophisticated, automatic font-substitution mechanism called font cascading. This mechanism takes font traits into account, so it does a better job than previous schemes of picking an appropriate font to substitute for a missing font. Font cascading is based on cascade lists, which are arrays of ordered font descriptors. There is a system default cascade list (which is polymorphic, based on the user's language setting and current font) and a font cascade list that is specified at font creation time. Using the information in the font descriptors, the cascading mechanism can match fonts according to style as well as matching characters. The CTFontCreateForString function uses cascade lists to pick an appropriate font to encode a given string. You specify and retrieve font cascade lists using the kCTFontCascadeListAttribute property."
Second, I wanted to point out that I had a bit of a problem reading the Japanese text in the top-right corner. I'm a native English speaker, and while I wouldn't call myself fluent in Japanese, I have taken a few years of Japanese courses. It's possible that a native Japanese speaker would not have the same problem that I'm having, so you might want to consult a native speaker on this.
I think the root of my problem is, that while Japanese text can be written left-to-right, top-to bottom, it can also be written top-to-bottom, right-to-left, and given that the text runs vertically, I want to read it that way. I think it might also be easier to read that way, with every character's baseline being perfectly horizontal, since the last character is rendered at almost a 90 degree angle difference from the first character. In English, I have no problem compensating for this, but in Japanese, it makes the last character look almost like "te" (but missing a stroke) instead of "to".
Again, a native speaker might not have this problem, but it's worth keeping in mind that other languages might have trouble with this kind of character rotation as you localize your interface into more languages.