The problem with using ARP for this is that a DHCP server can be attempting to allocate addresses on a remote subnet on which it doesn't have a interface. (DHCP works over routers, providing they provide a "DHCP-relay" function.) Since ARP isn't routed, it's only useful for checking that an address is in use on the local subnet. ICMP _is_ routed, so it allows the DHCP server to check for in-use addresses even when they are not local; provided that it's not blocked, of course.
Oh, so DHCP is possible across routers! That could be useful at times...
Interestingly DHCP clients do the address-in-use check too, and since the client only needs to check the local network, it does use ARP.
Okay, if most DHCP-clients do an ARP-check, then it is of course pointless for the server to do the same. It might be possible for the server to use ARP for local addresses and ICMP for routed ones. But it seems that it would gain nothing (except perhaps shorter time-out times), so I can see that it won't be worth the extra complications to the code.
All this stuff is specified in RFC 2131, which is well worth a read if you're interested in the nuts-and-bolts.
Well, I skimmed it just now, but luckily, I don't have to write my own DHCP-server, since there are already such excellent ones available for free :-) Rune