JMP is designed this way. I also wish it was different. The parts of the design that make this happen are (1) objects ignore messages they don't understand and (2) messages can be chained. Many releases ago JMP added a preference to make some objects report unrecognized messages. Whether it works depends on the object; I think the display boxes all have some common code to deal with it.
Chaining messages, like tb<<settext("hi")<<setcolor("red") is also allowed. The result of each << operator is the left side object. That means you can't get a grandparent with tb<<parent<<parent; you have to use (tb<<parent)<<parent.
By those rules, line 2 of your example does what it is supposed to.
I think the silently ignore unrecognized messages probably originated from studying the MS-windows message handling (previous century); there are an incredible number of messages that are silently ignored (like the mouse is moving over you, but you have no intention of ever responding to the mouse.) In JMP it could be used like this: { textBox, outlineBox } << setcolor("red") << close(1); where any box in the list that understands <<setcolor or <<close does the operation.
The difference between the two messages your examples sends to the data table is kdtable() is a global platform-like function while <<kNearestRows is a message that is only known to a kdtable object. The datatable itself likes to see messages that look like platform launches, dt<<distribution(...) for example. There is a bug here. I suspect kdtable is at fault for not reporting an issue with the "hello" argument, and the data table may think a platform was launched. Maybe the empty platform (sorry, there is no such thing.)
kdtable("hello")
/*:
Empty()
Craige