GetAsyncKeyState will let you know what is being press when you call the function. Your code goes by so fast, by the time the user lets the key go, it already told the program that it's still being pressed. A common solution is to have a flag that keeps track of the status of the return key (up or down) and use that in your checks as well.
This is a quick and dirty way of handling buffered input. The CPU problem shouldn't be much of an issue, unless it freezes the system. How else will you keep the program running (assuming you want to keep this a console app)?
bool returnDown = true;
if(GetAsyncKeyState(VK_RETURN) & 0x80 && returnDown)
//do whatever you want
returnDown = false;
if(!GetAsyncKeyState(VK_RETURN) & 0x80)
returnDown = true;