As I understand it, OP_RETURN allows the script to exit early with a result of FALSE without evaluating the remainder of the script. That means the transaction output is non-spendable but that the whole transaction still passes normal validation tests.
It is designed in a way that allows a small amount of arbitrary data to be embedded in the script.
See
https://bitcoin.org/en/release/v0.9.0#opreturn-and-data-in-the-block-chain says
OP_RETURN and data in the block chain
On OP_RETURN: There was been some confusion and misunderstanding in the community, regarding the OP_RETURN feature in 0.9 and data in the blockchain. This change is not an endorsement of storing data in the blockchain. The OP_RETURN change creates a provably-prunable output, to avoid data storage schemes – some of which were already deployed – that were storing arbitrary data such as images as forever-unspendable TX outputs, bloating bitcoin’s UTXO database.
Storing arbitrary data in the blockchain is still a bad idea; it is less costly and far more efficient to store non-currency data elsewhere.