Software is usually consistently repeatable and predictable, it does the same thing again and again.
Hardware problems on the other hand can be either predictable or intermittent.
Transistors and connections can fail for a few reasons, heat and vibration are two common ones. A solder connection (sometimes inside a chip) can come loose where it is sometimes working and sometimes not. A transistor can age and start to become noisy. A transistor can also age earlier than expected. This is exasperated with heat (both long term, and current temperature). And since your system has billions of transistors, well, just one can cause quite an issue.
One thing you might do is to put your entire computer in the freezer for a few hours, then quickly pull it out and try to start it up. This will sometimes temporarily work past a noisy transistor so you can figure out what is wrong. HOWEVER, if you live in a humid climate you will have to control for moisture condensing out on the electronics. You can put the whole thing in a tightly sealed clear plastic bag, and leave it in the bag (with the power cord feeding out) until it fully warms back up to room temperature.
You can also try to boot from another drive. You will have to tell your bios (or whatever you have) to allow booting from another drive, and you will have to have an operating system on some other drive or disk. For example some people still have boot DVDs. As for me I keep USB sticks with ubuntu and Debian (yes, the full os is on the USB sticks).
Also you can take your hard drive out and plug it into a USB drive carrier (available for about $10) and use another computer to mount the drive and test it for sanity or the like.
THE MAIN IDEA is divide and conquer: Try to break your system in half and figure out which half is bad. Is it the software on the drive, or the hardware trying to run that drive? You have already taken a look at memory, but that is only taking 5% of your system out of the loop. Try to take and split the system in to something like 50/50. And figure out which half of the system the issue is in. Then, once you know which half, break that half in half again if you can. Hope this has given you a few ideas.
Computers are so complex that hunt and guess is not a good way to quickly find issues. Better to break things in half, and use a binary search for the culprit.