If you have defined your custom component as a register slave it will use native addressing. That means that if your slave is only 8 bits wide it should ignore the upper 24 bits of the data written by IOWR. Likewise, IORD will return your slave data in the lower 8 bits of a 32 bit word, with the upper 24 bits set to zero.
For the issue of byte enables to arise, I'd guess you must have defined your component as a memory slave so it will use dynamic addressing. To read/write a single byte, you'd have to use IOWR_8DIRECT and IORD_8DIRECT. Have a look in the file io.h if you want to understand what these macros do. Also, the Avalon spec. document explains the difference between native and dynamic addressing and how different data bus widths are handled.