All of those things are working as intended. The important thing to understand is how Polymer uses attributes to set up data bindings.
If you set an attribute on an element, you're just setting an attribute:
<foo-bar some-thing="blue">
**If** `foo-bar` is a Polymer element and its `someThing` property has property effects (like data bindings or observers) associated with it, Polymer will set the property value from the literal. We call this "configuring" the element, since it's a mostly static. If it's not a property that Polymer is concerned with, it gets left alone.
(It's not that _nothing_ happens here: getAttribute('some-thing') still returns 'blue'. But it doesn't touch the element's properties.)
However, Polymer also uses attributes to set up data bindings:
<foo-bar some-thing="{{blue}}">
Think of it this way: as soon as we see that data binding annotation, this becomes a different thing: a property binding. When `blue` changes, Polymer pushes the change down to `foo-bar.someThing` (and vice-versa, since this is a two-way binding: when someThing changes, the change propagates up to `blue`).
Property bindings set the property regardless of whether `foo-bar` is a Polymer element or has a property called `someThing`. This lets us push arbitrary properties to native elements, for example.
Finally, for the compound binding, where you combine binding annotations with string literals, the defined behavior is for an undefined property to be replaced with the empty string. So "{{undefinedProp}}Foo" becomes "Foo". If you want different behavior—like conditionally printing "Foo" if and only if the property is defined, then you probably need a computed binding, instead.
-Arthur