I think Cora “let” Hook keep his heart because she couldn’t actually pull it out.
Because he is the product of true love just like Emma.
It’s also why Rumple doesn’t take his heart when he takes Milah’s heart. Because Rumple knows it isn’t possible. He had so many chances to kill him but didn’t. He keeps making up excuses for letting Hook live because he doesn’t want Hook or anyone else to know the truth.
One more reason they are meant to be together.