Is there any efficient algorithm for finding subgroups of a given finite group?
I don't know the details of any of the standard algorithms currently in use. Regardless, here are some things you can do to speed up your initial implementation (at least the on-average running time).
1) Every subgroup is a union of cyclic subgroups. So, you enumerate the cyclic subgroups as you have done. Then, start forming unions of those and check whether or not you have a subgroup (this of course is the time-consuming part).
2) Discard any union of cyclic subgroups whose size does not divide the size of the group (because of Lagrange).
3) Using Sylow you can get some information on the number of subgroups of certain prime power order, and that means you can stop the search for a given size when you found all possible subgroups of that size that can exist.
4) Of course if the group is abelian than there are less potential products to check and you can use other structure theorems to speed things up.