Great idea on the debugging of the cURL post - I figured it out. It was just about the headers - the data WAS being passed correctly.
Once the JSON is created, here's the CFHTTP call:
<cfhttp url="https://mydomain.org/service/user/login?oauth_consumer_key=myKeyHere" method="post" >
<cfhttpparam type="header" name="Content-type" value="application/json" >
<cfhttpparam type="header" name="Accept" value="*/*" >
<cfhttpparam type="body" value="#mydata#" >
</cfhttp>
Works great - thanks to Leigh for helping me think this through!