Because that's just how the language is designed. Only function declarations and variable declarations (but not initialization) are hoisted. So your code is really:
var myObj = undefined;
var property = undefined;
for(property in myObj)
alert(myObj[property].toString());
myObj = {
property1: "chocolate",
property2: "cake",
property3: "brownies"
};
}
...which fails not because the variable myObj doesn't exist yet (it does), but because that variable has the value undefined, and you can't use for-in on undefined.
If you think about it, it makes reasonable sense: A function declaration creates a unit of work (a function) based only on its own content, and then is executed later (with any variables it closes over evaluated later, when it's executed), but an object initialization can rely on other things (like variables and such) which would need to be evaluated as of the initialization, not later.
Example:
var answer = 42;
var obj = {
property: answer
};
The declaration of obj and answer are hoisted, but it's impossible to hoist the creation of the object we assign to obj, because it has to use the value of the answer variable in order to initialize the property property.
In contrast:
var answer = 42;
foo();
function foo() {
console.log("The answer is " + answer);
}
Both the declaration of answer and the declaration/creation of the foo function are hoisted, and that's fine, because although foo uses answer, it doesn't use it until later, when it's called.