>Your problem is not COMPOSE/DEEP, your problem is TO-BLOCK. Do you really need that?
In case do-something is generated dynamically

In the case of constant code have found this which works (I don't know if it's the most elegant way though):
o: make object! [
property: false
set-property: func [b [block!]][do compose [(B)]]
do-something: [(do bind [set-property [self/property: true]] 'self)]
rules: compose/deep ["do something" (do-something)]
probe rules
test: "do something"
parse test rules
]
>> o: make object! [
[ property: false
[ set-property: func [b [block!]][do compose [(B)]]
[ do-something: [(do bind [set-property [self/property: true]] 'self)]
[ rules: compose/deep ["do something" (do-something)]
[ probe rules
[ test: "do something"
[ parse test rules
[ ]
["do something" (do bind [set-property [self/property: true]] 'self)]
>> o/property
== true