Updates!!
Unfortunately, even the SG_IO method of sending write command (technically they are SAT commands, though the core is ATA commands) could not be failed for a bad sector.
I have confirmed the bad sector presence with the help of MHDD, Winhex and HDDSCAN utilities, but the linux program is unable to identify them as bad and the write passes through without any issues.
I even tried the sg_dd command from sg3-utils package which does the same write method as what I have attempted and even that fails to identify the bad sectors. (with or without direct io enabled at /proc/scsi/sg/allow_dio).
I have tried sgio, dio, dsync, fsync and almost all the combinations of multiple blocks per transfer ranging from a single sector to 512 sectors. (1, 8, 16,32,64, 128, 256 and 512 sectors per transfer). None could identify the bad sectors.
I am completly out of options unless if somebody could direct me else where!!
Testing takes a LOT of time even for a smaller HDD (20 GB).
My sincere thanks to Corona688 and fpmurphy for all their valuble comments, critics and suggestions!