So far the only way I have seen is smartly using floats to represent them, is there something easier/more efficient/more direct?
If they're dynamic branches (decisions that have to be made per-pixel/vertex), then yeah, you have to use float because there are no integer/bool registers in SM3.
The best way to deal with branching is to avoid doing branching
In your example, you end up using two different branches (one nested in the other). It would likely be much better to just use a single branch, due to how expensive they are on SM3 hardware...
By the way, the reason I have recently started learning shader assembly is that I have a shader for which both Cg and HLSL require too many temporaries to run, while I know it can be done with less
Does the compiler fail due to this, or the runtime?
Usually you can massage your HLSL code to produce better asm, rather then writing the asm yourself (e.g. by using the HLSL attributes such as branch, flatten, fastopt, forcecase, call, unroll, loop, isolate, or by writing more asm-like code).
e.g. to tell the compiler to use a series of cmp instructions and arithmetic for that branch, you could try something like:
[branch]
if( 0 < step(a,b) * (step(c,d) + step(e,f)) )